美文网首页
Vue第二部分

Vue第二部分

作者: 珲_cysky2018 | 来源:发表于2018-08-29 22:11 被阅读0次

品牌列表案例

运用的知识:

v-model进行双向绑定

@click.prevent="del(id)" 函数传参

v-for循环

String.prototype.includes('要包含的字符串')

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>cysky</title>
    <link rel="stylesheet" href="../lib/bootstrap-3.3.7.css">
    <script src="../lib/vue-2.4.0.js"></script>
</head>
<body>
<div id="app">
    <div class="panel panel-primary">
        <div class="panel-heading">
            <h3>添加品牌</h3>
        </div>
        <div class="panel-body form-inline">
            <label for="">
                ID:
                <input type="text" class="form-control" v-model="id">
            </label>
            <label for="">
                Name:
                <input type="text" class="form-control" v-model="name">
            </label>
            <label for="">
                <input type="button" value="添加" class="btn btn-primary" @click="add">
            </label>
            <label for="">
                搜索名称关键字:
                <input type="text" class="form-control" v-model="keywords">
            </label>
        </div>
    </div>

    <table class="table table-bordered table-striped table-hover">
        <thead>
        <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Ctime</th>
            <th>Del</th>
        </tr>
        </thead>
        <tbody>
        <tr v-for="item in search(keywords)">
            <td>{{ item.id }}</td>
            <td>{{ item.name }}</td>
            <td>{{ item.ctime }}</td>
            <td><a href="" @click.prevent="del(id)">删除</a></td>
        </tr>
        </tbody>
    </table>
</div>

<script>
    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() {
                var car = {id: this.id, name: this.name, ctime: new Date()};
                this.list.push(car);
                this.id = '';
                this.name = ''
            },
            del(id) {
                var index = this.list.indexOf(function (item) {
                    if (item.id === id) {
                        return true
                    }
                });
                this.list.splice(index, 1)
            },
            search(keywords) {
                return this.list.filter(function (item) {
                    if (item.name.includes(keywords)) {
                        return item
                    }
                })
            }
        }
    })
</script>
</body>
</html>

<tr v-for="item in search(keywords)">

之前,v-for 中的数据,都是直接从 data 上的 list 中直接渲染过来的,现在,这里定义了一个 search 方法 在 search 方法内部,通过执行 for 循环,把所有符合搜索的关键字的数据,保存到一个新数组中返回。

全局过滤器

定义私有过滤器 过滤器有两个 条件 【过滤器名称 和 处理函数】

所谓的全局过滤器,就是所有的VM实例都共享的

Vue.filter('dataFormat',function(dataStr,pattern = ''){
        var dt = new Date(dataStr);
        var y = dt.getFullYear();
        var m = dt.getMonth()+1;
        var d = dt.getDate().toString().padStart(2,'0');
        var h = dt.getHours().toString().padStart(2,'0');
        var mm = dt.getMinutes().toString().padStart(2,'0');
        var s = dt.getSeconds().toString().padStart(2,'0');
        return `${y}-${m}-${d} ${h}:${mm}:${s}`
    });

使用: <td>{{ item.ctime | dateFormat() }}</td>

私有过滤器

过滤器调用的时候,采用就近原则,如果私有过滤器和全局过滤器名称一致,这时候优先调用私有过滤器

filters:{
            timeFormat: function (dateStr, pattern='') {
                var dt = new Date(dateStr);
                var y = dt.getFullYear();
                var m = dt.getMonth() + 1;
                var d = dt.getDate();
                var h = dt.getHours().toString().padStart(2,'0');
                var mm = dt.getMinutes().toString().padStart(2,'0');
                var s = dt.getSeconds().toString().padStart(2,'0');
                return `${y}-${m}-${d} ${h}:${mm}:${s}`
            }
        }

自定义全局按键修饰符

全部的按键别名:

  • .enter
  • .tab
  • .delete (捕获“删除”和“退格”键)
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right

以上可以直接使用:@click.enter = 'add'

Vue.config.keyCodes.f2 = 113

使用:@click.f2='add'

使用Vue.directive()定义全局的指令

 Vue.directive('focus',{
        inserted:function(el){
            el.focus()
        }
    });

使用:<input type="text" class="form-control" v-model="keywords" id="search" v-focus v-color="'green'">

inserted 表示元素 插入到DOM中的时候,会执行 inserted 函数【触发1次】

和样式相关的操作,一般都可以在 bind 执行

    Vue.directive('color',{
        bind:function(el,binding){
            el.style.color = 'red';
            console.log(binding.value)
        }
    });

使用:<input type="text" class="form-control" v-model="keywords" id="search" v-focus v-color="'green'">

每当指令绑定到元素上的时候,会立即执行这个 bind 函数,只执行一次

函数中的第一个参数永远是 el ,表示被绑定了指令的那个元素, 这个 el 参数, 是一个原生的 JS 对象

和 JS 行为有关的操作,最好在 inserted 中去执行

参数1:指令的名称,注意,在定义的时候,指令名称前不需要加 v- 前缀,但是,在调用的时候,必须在指令名称前加上 v- 前缀来进行调用

参数2:是一个对象,这个对象身上,有一些指令相关的函数,这些函数可以在特定阶段,执行相关的操作

自定义私有指令

 directives: {
            'fontweight': {
                bind: function (el, binding) {
                    el.style.fontWeight = binding.value
                }
            },
            'fontsize': {
                bind: function (el, binding) {
                    el.style.fontSize = binding.value
                }
            }
        }

品牌列表完整案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>cysky</title>
    <link rel="stylesheet" href="../lib/bootstrap-3.3.7.css">
    <script src="../lib/vue-2.4.0.js"></script>
</head>
<body>
<div id="app">
    <div class="panel panel-primary">
        <div class="panel-heading">
            <h3>添加品牌</h3>
        </div>
        <div class="panel-body form-inline">
            <label for="">
                ID:
                <input type="text" class="form-control" v-model="id">
            </label>
            <label for="">
                Name:
                <input type="text" class="form-control" v-model="name">
            </label>
            <label for="">
                <input type="button" value="添加" class="btn btn-primary" @click="add">
            </label>
            <label for="">
                搜索名称关键字:
                <input type="text" class="form-control" v-model="keywords" v-focus>
            </label>
        </div>
    </div>

    <table class="table table-bordered table-striped table-hover">
        <thead>
        <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Ctime</th>
            <th>Del</th>
        </tr>
        </thead>
        <tbody>
        <tr v-for="item in search(keywords)">
            <td>{{ item.id }}</td>
            <td>{{ item.name }}</td>
            <td>{{ item.ctime | timeFormat() }}</td>
            <td><a href="" @click.prevent="del(id)">删除</a></td>
        </tr>
        </tbody>
    </table>

    <p v-fontsize="50" v-color="'blue'">这是一个P标签,用于测试私有directives</p>
</div>

<script>
    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() {
                var car = {id: this.id, name: this.name, ctime: new Date()};
                this.list.push(car);
                this.id = '';
                this.name = ''
            },
            del(id) {
                var index = this.list.indexOf(function (item) {
                    if (item.id === id) {
                        return true
                    }
                });
                this.list.splice(index, 1)
            },
            search(keywords) {
                return this.list.filter(function (item) {
                    if (item.name.includes(keywords)) {
                        return item
                    }
                })
            }

        },
        filters: {//私有过滤器
            timeFormat: function (dateStr, pattern = '') {
                var dt = new Date(dateStr);
                var y = dt.getFullYear();
                var m = dt.getMonth() + 1;
                var d = dt.getDate();
                var h = dt.getHours().toString().padStart(2, '0');
                var mm = dt.getMinutes().toString().padStart(2, '0');
                var s = dt.getSeconds().toString().padStart(2, '0');
                return `${y}-${m}-${d} ${h}:${mm}:${s}`
            }
        },
        directives: {//自定义私有指令
            'fontweight': {
                bind: function (el, binding) {
                    el.style.fontWeight = binding.value
                }
            },
            'fontsize': {
                bind: function (el, binding) {
                    el.style.fontSize = parseInt(binding.value) + 'px'
                }
            },
            'color': {
                bind: function (el, binding) {
                    el.style.color = binding.value
                }
            },
            'focus': {
                inserted: function (el) {
                    el.focus()
                }
            }
        }
    })
</script>
</body>
</html>

生命周期

lifecycle.png

beforeCreate(){}:这是我们遇到的第一个生命周期函数,表示实例完全被创建出来之前,会执行它

注意:beforeCreate(){} 执行的时候,data 和 methods 中的数据都还没有初始化

created(){} 这是遇到的第二个生命周期函数,在 created 中,data 和 methods 都已经被初始化好了

注意:如果要调用 methods 中的方法,或者操作 data 中的数据,最早,只能在 created 中操作

beforeMount(){} 这是遇到的第三个生命周期函数,表示模版已经在内存中编辑完成了,但是尚未把模版渲染到页面中

注意:在 beforeMount 执行的时候,页面中的元素,还没有被真正替换过来,只是之前写的模版字符串

mounted(){} 这是遇到的第四个盛名周期函数,表示,内存中的模版,已经真实的挂载到了页面中,用户已经可以看到渲染好的页面了

注意:mounted 是实例创建期间最后的一个生命周期函数,当执行完 mounted 就表示,实例已经被完全创建好了,此时,如果没有其他操作,这个实例就在内存中,等候

接下来的是运行中的两个事件

beforeUpdate() {} 这时候表示我们的界面还没有被更新(数据已经更新了)

结论: 当执行 beforeUpdate 的时候,页面中的显示的数据,还是旧的,此时 data 数据是最新的,页面尚未和 最新的数据保持同步

updated(){} 事件执行的时候,页面和 data 数据已经保持同步了,都是最新的

相关文章

网友评论

      本文标题:Vue第二部分

      本文链接:https://www.haomeiwen.com/subject/vsllwftx.html