Vue的学习笔记-Day2-01(品牌列表案例的基础部分)

品牌列表案例的基础部分

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="lib/bootstrap.css">
    <script src="lib/vue-2.6.10.js"></script>
    <style>
        [v-cloak] {
            display: none;
        }
    </style>
</head>
<body>

<div id="app">
    <div class="panel panel-primary">
        <div class="panel-heading">
            <h3 class="panel-title">添加品牌</h3>
        </div>
        <div class="panel-body form-inline">
            <label>
                Id:
                <input type="text" class="form-control" v-model="id">
            </label>
            <label>
                Name:
                <input type="text" class="form-control" v-model="name" @keyup.enter="add">
                <!--按键修饰符-->
            </label>
            <!--在vue中,使用事件绑定机制,为元素指定处理函数的时候,如果加了小括号,就可以给函数传参-->
            <input type="button" value="添加" class="btn btn-primary" @click="add">
            <label>
                搜索名称关键字:
                <!--在vue中所有的指令在调用的时候,都用v-开头-->
                <input type="text" class="form-control" v-model="keywords" v-focus v-color="'blue'">
            </label>
        </div>
    </div>

    <table class="table table-bordered table-hover table-striped">
        <thead>
        <tr>
            <th>Id</th>
            <th>Name</th>
            <th>Ctime</th>
            <th>Operation</th>
        </tr>
        </thead>
        <tbody>
        <!--之前,v-for 中的数据,都是从 data 上的list中直接渲染过来的-->
        <!--现在,我们自定义了一个 search 方法,同时,把所有关键字,通过传参的形式,传递给了search 方法-->
        <!--在search方法内部通过执行for循环,把所有符合搜索关键字的数据,保存在一个新数组中-->
        <tr v-for="item in search(keywords)" :key="item.id">
            <td>{{item.id}}</td>
            <td>{{item.name}}</td>
            <td>{{item.ctime | dateFormat('yyyy-mm-dd')}}</td>
            <td>
                <a href="" @click.prevent="del(item.id)">删除</a>
            </td>
        </tr>
        </tbody>
    </table>

</div>

<script>
    //全局过滤器,进行时间的格式化
    Vue.filter('dateFormat', function (dateStr, pattern = '') {
        //根据给定的时间字符串,得到特定的时间
        var dt = new Date(dateStr);
        var y = dt.getFullYear();
        var m = (dt.getMonth() + 1).toString().padStart(2, '0');
        var d = dt.getDate().toString().padStart(2, '0');

        // return y + '-' + m + '-' + d;
        //上面的拼接方法过于繁琐,采用下面的模板字符串方法进行拼接

        if (pattern.toLowerCase() === 'yyyy-mm-dd') {
            return `${y}-${m}-${d}`;
        } else {
            var hh = dt.getHours().toString().padStart(2, '0');
            var mm = dt.getMinutes().toString().padStart(2, '0');
            var ss = dt.getSeconds().toString().padStart(2, '0');

            return `${y}-${m}-${d} ${hh}:${mm}:${ss}`;
        }
    });

    //自定义全局指令
    //其中参数1是指令的名称,注意,在定义的时候,指令的前面不需要加v-前缀,但是在调用的时候,必须在指令名称前加上v-前缀
    //参数2是一个对象,这个对象身上有一些指令相关的函数,这些函数可以在特定的阶段执行相关的操作
    Vue.directive('focus', {
        bind: function (el) {//每当指令绑定到元素上的时候,会立即执行这个bind函数,只执行一次
            // el.focus();
            /*在元素刚绑定了指令的时候,还没有插入到dom中的时候,调用focus方法没有作用,因为一个元素只有插入DOM之后才能获取焦点*/
            /*注意,在每个函数中,第一个参数,永远都是el,表示被绑定了指令的元素,是一个原声的对象*/
        },
        inserted: function (el) {//inserted表示元素插入到Dom中的时候,会执行此函数,且只执行一次
            /*和js行为有关的操作,最好在inserted中去执行,防止js行为不生效*/
            el.focus();
        },
        updated: function (el) {//当VNode更新的时候,会执行 updated,可能会触发多次
        }

    });


    //自定义一个全局自动设置颜色的指令
    Vue.directive('color', {
        //样式只要通过指令绑定给了元素,不管这个元素有没有被插入到页面中去,这个元素肯定有了一个内联的样式
        //将来元素肯定会显示到页面中去,这时候,浏览器的渲染引擎必然会解析样式,应用给这个元素
        bind: function (el, binding) {
            el.style.color = binding.value;
            /*和样式相关的操作,一般都可以在bind中执行*/
        }
    });

    //创建vue实例
    var vm = new Vue({
        el: '#app',
        data: {
            id: '',
            name: '',
            keywords: '',//搜索关键字
            list: [
                {id: 1, name: '奔驰', ctime: new Date()},
                {id: 2, name: '宝马', ctime: new Date()},
            ]
        },
        methods: {
            add() {//添加的方法
                //分析
                //获取 id 和 name ,直接从data中获取
                //组织出一个对象
                //把这个对象,调用数组的相关方法,添加到当前data中的list中
                //注意: 在vue中已经实现了数据的双向绑定,每当我们修改了data中的数据,vue会默认监听到数据改动,自动把最新的数据应用到页面上

                var obj = {id: this.id, name: this.name, ctime: new Date()};
                this.list.push(obj);
                this.id = this.name = '';
            },
            del(id) {//根据id删除数据
                //分析
                //如何根据id找到要删除这一项的索引
                //如果找到索引直接调用数组的splice方法

                this.list.some((item, i) => {
                    if (item.id == id) {
                        //在数组的some方法中,如果return true 就会终止后续循环
                        this.list.splice(i, 1);
                        /*
                          array.splice(start,deleteCount,item1,item2...)
                          start: 开始操作的索引
                          deleteCount:要移除的数组元素的个数
                          itemN:要添加进数组的元素,如果不指定,则splice只删除数组元素
                        */
                        return true;
                    }
                })
            },
            search(keywords) {//根据关键字进行数据的搜索
                // var newList = [];
                // this.list.forEach(item => {
                //     if (item.name.indexOf(keywords) != -1) {
                //         newList.push(item)
                //     }
                // });
                // return newList;

                // 注意: forEach some filter findIndex 这些都属于数组的新方法
                //都会对数组中的每一项,进行遍历,执行相关的操作
                return this.list.filter(item => {
                    //注意: ES6中,为字符串提供了一个新方法,叫做 String.prototype.includes('要包含的字符串')
                    //如果包含,则返回true,否则返回false
                    return item.name.includes(keywords)
                })
            }
        }
    });
</script>

<!--过滤器的定义语法-->
<!--Vue.filter('过滤器名称',function(){})-->

<!--过滤器中的 function , 第一个参数已经被规定死了,永远都是过滤器管道符前面传递过来的数据-->
<div id="app2">
    <!--可以有多个过滤器,按照从左到右的顺序过滤,将前面过滤的结果传到后面的过滤器-->
    <p v-cloak>{{ msg | msgFormat('疯狂','+1') | test }}</p>
</div>

<script>
    //定义一个Vue全局过滤器,名字叫做 msgFormat
    //过滤器调用时候的格式  {{name | nameope}}
    Vue.filter('msgFormat', function (msg, arg, arg2) {
        //字符串的 replace方法,第一个参数,除了可写一个 字符串之外,还可以定义一个正则
        return msg.replace(/单纯/g, arg + arg2);
    });

    Vue.filter('test', msg => {
        return msg + '========';
    });

    var vm = new Vue({
        el: '#app2',
        data: {
            msg: '我是一个单纯的男孩,我曾以为我是最单纯的!'
        }
    })
</script>

<!--如何定义一个私有(局部)的过滤器-->
<!--过滤器调用的时候,采用的是就近原则,如果私有过滤器和全局过滤器名称一致,优先到调用私有-->
<!--
var vm = Vue({
    el: '',
    data:{},
    methods:{},
    filters:{//定义私有过滤器,过滤器有两个条件,【过滤器名称 和 处理函数】
        dateFormat: function(dataStr, pattern){
            //过滤的条件
        }
    },
})


-->

<!--如何定义一个私有(局部)的指令-->
<!--
var vm = Vue({
    el: '',
    data:{},
    methods:{},
    directives:{//自定义私有指令
        'fontWeight':{
            bind: function(el, binding){
                el.style.fontWeight = binding.value;
            }
        }
    }
})


-->

<script>
    /*自定义全局按键修饰符*/
    Vue.config.keyCodes.f2 = 113;
</script>

</body>
</html>


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容

  • 每个月都有那么几次说不清的情绪,来的快去的也快,只消一个夜晚,又是一个新的开始。 今天的夜!有点凉,已经要霜降了,...
    娶王子的将军阅读 370评论 1 4
  • 何颖颖坚持读书第323天 《建构解决之道》第四章:焦点解决督导构成要素的探讨与应用 第359—361页 。
    何颖颖h阅读 125评论 0 0
  • 夜 悄悄地来了, 喧嚣的白日已彻底落下帷幕。 奔波劳碌中微感有些疲乏, 脚儿重,身心乏,眼皮有些无力的在眨巴。 人...
    清幽励志文苑阅读 654评论 0 1
  • 追寻是个人的成长。 因为这才是一个人幸福的本质原因。 不要有任何情绪,叫做成熟。
    厦大平兄探险记阅读 201评论 0 0
  • 拿起这本书,首先没有翻阅目录而是被书的封面所吸引,“阿乙是一个了不起的作家,平静但是犀利,像是一个见惯了大...
    15刘思怡阅读 425评论 0 1