玩转Vue_品牌实例+过滤器

2019-02-12  本文已影响0人  伍陆柒_
练习实例:品牌列表
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <link rel="stylesheet" type="text/css" href="../css/bootstrap.css"/>
        <script type="text/javascript" src="../js/vue.js"></script>
    </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"/>
                    </label>
                    <!-- add函数加不加括号都可以,需要传参时必须加括号 -->
                    <button type="button" class="btn btn-primary" @click="add">添加</button>
                </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>
                    <tr v-for="item in list" :key="item.id">
                        <td>{{item.id}}</td>
                        <td>{{item.name}}</td>
                        <td>{{item.ctime}}</td>
                        <td>
                            <!-- 阻止默认行为,传参id -->
                            <a href="" @click.prevent="del(item.id)">删除</a>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
        <script type="text/javascript">
            var vm = new Vue({
                el: '#app',
                data: {
                    id : '',
                    name : '',
                    list : [
                        {id:1,name:'奔驰',ctime:new Date()},
                        {id:2,name:'奥迪',ctime:new Date()}
                    ]
                },
                methods: {
                    add(){ // 添加方法
                        //  获取id和name,直接从data中获取
                        //  组织一个对象
                        //  把这个对象添加到data中的list中
                        var brand = {id : this.id,name : this.name,ctime : new Date()};
                        this.list.push(brand);
                        //  清空内容
                        this.id = this.name = '';
                    },
                    del(id){ // 根据id删除数据 
                        // 正常情况下可能是操作数据库执行sql语句
                        // 第一种删除处理方式
//                      this.list.forEach((elem,i)=>{
//                          if(elem.id == id){
//                              this.list.splice(i,1);
//                          }
//                      })
                        // 第二种删除处理方式,some()与forEach基本一致,some() return true 就立即停止了
//                      this.list.some((item,i) => {
//                          if(item.id == id){
//                              this.list.splice(i,1);
//                              return true;
//                          }
//                      })
                        // 第三种,使用findIndex,专门用来查找索引
                        var index = this.list.findIndex(item => {
                            if(item.id == id){
                                return true;
                            }
                        })
                        this.list.splice(index,1)
                    }
                }
            })
        </script>
    </body>
</html>
关键字过滤
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <link rel="stylesheet" type="text/css" href="../css/bootstrap.css"/>
        <script type="text/javascript" src="../js/vue.js"></script>
    </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"/>
                    </label>
                    <!-- add函数加不加括号都可以,需要传参时必须加括号 -->
                    <button type="button" class="btn btn-primary" @click="add">添加</button>
                    <label>
                        搜索名称关键字 : <input type="text" class="form-control" v-model="keywords"/>
                    </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>
                    <!-- 注意:关键字过滤要根据最新的关键字,重新渲染数据,所以这里不能遍历list -->
                    <!-- 现在我们定义了一个serch方法,同时把所有关键字通过传参传递给serch方法 -->
                    <!-- 在serch方法内部通过执行for循环,把所有符合搜索关键字的数据保存到一个新数组中返回,遍历 -->
                    <tr v-for="item in serch(keywords)" :key="item.id">
                        <td>{{item.id}}</td>
                        <td>{{item.name}}</td>
                        <td>{{item.ctime}}</td>
                        <td>
                            <!-- 阻止默认行为,传参id -->
                            <a href="" @click.prevent="del(item.id)">删除</a>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
        <script type="text/javascript">
            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中
                        var brand = {id : this.id,name : this.name,ctime : new Date()};
                        this.list.push(brand);
                        //  清空内容
                        this.id = this.name = '';
                    },
                    del(id){ // 根据id删除数据 
                        // 正常情况下可能是操作数据库执行sql语句
                        // 第一种删除处理方式
//                      this.list.forEach((elem,i)=>{
//                          if(elem.id == id){
//                              this.list.splice(i,1);
//                          }
//                      })
                        // 第二种删除处理方式,some()与forEach基本一致,some() return true 就立即停止了
//                      this.list.some((item,i) => {
//                          if(item.id == id){
//                              this.list.splice(i,1);
//                              return true;
//                          }
//                      })
                        // 第三种,使用findIndex,专门用来查找索引
                        var index = this.list.findIndex(item => {
                            if(item.id == id){
                                return true;
                            }
                        })
                        this.list.splice(index,1)
                    },
                    serch(keywords){ // 根据关键字进行数据的搜索
                        // 第一种方式(forEach,some,filter,findIndex都属于数组的新方法)
                        // forEach不能中途终止
                        // some只要返回true,就代表终止
                        // filter返回一个数组
                        // findIndex可以返回索引
                        
//                      var newList = [];
//                      this.list.forEach(item=>{
//                          if(item.name.indexOf(keywords) != -1){
//                              newList.push(item);
//                          }
//                      })
//                      return newList;
                        
                        // filter的方式
                        var newList = this.list.filter(item=>{
                            if(item.name.includes(keywords)){
                                return item;
                            }
                        })
                        return newList;
                    }
                }
            })
        </script>
    </body>
</html>
过滤器

Vue中允许自定义过滤器,可被用作一些常见的文本格式化;
过滤器可用在两个地方:mustache插值{{}}和v-bind表达式,过滤器应该被添加在JavaScript表达式的尾部,由“管道”符表示

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <link rel="stylesheet" type="text/css" href="../css/bootstrap.css"/>
        <script type="text/javascript" src="../js/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <!-- msg是要处理的数据,msgFormat的第一个参数是要处理的数据 -->
            <p>{{msg | msgFormat}}</p>
            <!-- 过滤器也可以传参 -->
            <p>{{msg | msgFormat('踢')}}</p>
            <!-- 过滤器的链式操作,msgFormat处理完数据后交给test过滤器再进行处理 -->
            <p>{{msg | msgFormat('踢') | test}}</p>
        </div>
        <script type="text/javascript">
            // 不能写vm后
            // 定义一个全局过滤器,名字叫msgFormat,data是要处理的数据
            // arg0是传过来的参数
            Vue.filter('msgFormat',function(data,arg0){
                // 此处只能替换第一个
                // return data.replace('削','盘');
                // 此处是正则表达式,g代表全局匹配,
                return data.replace(/削/g,'盘'+arg0);
            })
            Vue.filter('test',function(data){
                return data+'==================';
            })
            var vm = new Vue({
                el: '#app',
                data: {
                    msg : '皱皱巴巴,麻麻赖赖,一点儿不圆润,削他,削他,削他'
                },
                methods: {}
            })
        </script>
    </body>
</html>

过滤器实现时间格式化

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <link rel="stylesheet" type="text/css" href="../css/bootstrap.css"/>
        <script type="text/javascript" src="../js/vue.js"></script>
    </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"/>
                    </label>
                    <!-- add函数加不加括号都可以,需要传参时必须加括号 -->
                    <button type="button" class="btn btn-primary" @click="add">添加</button>
                    <label>
                        搜索名称关键字 : <input type="text" class="form-control" v-model="keywords"/>
                    </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>
                    <!-- 注意:关键字过滤要根据最新的关键字,重新渲染数据,所以这里不能遍历list -->
                    <!-- 现在我们定义了一个serch方法,同时把所有关键字通过传参传递给serch方法 -->
                    <!-- 在serch方法内部通过执行for循环,把所有符合搜索关键字的数据保存到一个新数组中返回,遍历 -->
                    <tr v-for="item in serch(keywords)" :key="item.id">
                        <td>{{item.id}}</td>
                        <td>{{item.name}}</td>
                        <!-- 利用过滤器格式化时间 -->
                        <td>{{item.ctime | dateFormat}}</td>
                        <td>
                            <!-- 阻止默认行为,传参id -->
                            <a href="" @click.prevent="del(item.id)">删除</a>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
        <script type="text/javascript">
            function format(date){
                return date < 10 ? '0'+date : date;
            }
            //  时间格式化过滤器
            Vue.filter('dateFormat',function(dateStr){
                var dt = new Date(dateStr);
                var y = dt.getFullYear();
                var m = dt.getMonth()+1;
                var d = dt.getDate();
                var hh = dt.getHours();
                var mm = dt.getMinutes();
                var ss = dt.getSeconds();
                return `${format(y)}-${format(m)}-${format(d)} ${format(hh)}:${format(mm)}:${format(ss)}`;
            })
            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中
                        var brand = {id : this.id,name : this.name,ctime : new Date()};
                        this.list.push(brand);
                        //  清空内容
                        this.id = this.name = '';
                    },
                    del(id){ // 根据id删除数据 
                        // 正常情况下可能是操作数据库执行sql语句
                        // 第一种删除处理方式
//                      this.list.forEach((elem,i)=>{
//                          if(elem.id == id){
//                              this.list.splice(i,1);
//                          }
//                      })
                        // 第二种删除处理方式,some()与forEach基本一致,some() return true 就立即停止了
//                      this.list.some((item,i) => {
//                          if(item.id == id){
//                              this.list.splice(i,1);
//                              return true;
//                          }
//                      })
                        // 第三种,使用findIndex,专门用来查找索引
                        var index = this.list.findIndex(item => {
                            if(item.id == id){
                                return true;
                            }
                        })
                        this.list.splice(index,1)
                    },
                    serch(keywords){ // 根据关键字进行数据的搜索
                        // 第一种方式(forEach,some,filter,findIndex都属于数组的新方法)
                        // forEach不能中途终止
                        // some只要返回true,就代表终止
                        // filter返回一个数组
                        // findIndex可以返回索引
                        
//                      var newList = [];
//                      this.list.forEach(item=>{
//                          if(item.name.indexOf(keywords) != -1){
//                              newList.push(item);
//                          }
//                      })
//                      return newList;
                        
                        // filter的方式
                        var newList = this.list.filter(item=>{
                            if(item.name.includes(keywords)){
                                return item;
                            }
                        })
                        return newList;
                    }
                }
            })
        </script>
    </body>
</html>

私有过滤器

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <link rel="stylesheet" type="text/css" href="../css/bootstrap.css"/>
        <script type="text/javascript" src="../js/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <p>{{date | dateFormat}}</p>
        </div>
        <div id="box">
            <p>{{date | dateFormat}}</p>
        </div>
        <script type="text/javascript">
            function format(date){
                return date < 10 ? '0'+date : date;
            }
            // 全局过滤器是每一个vue实例都可用的
            // date(第一个参数)永远是需要处理的数据
            Vue.filter('dateFormat',function(data){
                var dt = new Date(data);
                var y = dt.getFullYear();
                var m = dt.getMonth()+1;
                var d = dt.getDate();
                var hh = dt.getHours();
                var mm = dt.getMinutes();
                var ss = dt.getSeconds();
                return `${format(y)}-${format(m)}-${format(d)} ${format(hh)}:${format(mm)}:${format(ss)}`;
            })
            var vm = new Vue({
                el: '#app',
                data: {
                    date : new Date()
                },
                methods: {}
            })
            var vm2 = new Vue({
                el : '#box',
                data : {
                    date : new Date()
                },
                methods: {},
                // 私有过滤器,就近原则,优先级高于全局过滤器
                filters:{
                    dateFormat : function(data){
                        var dt = new Date(data);
                        var hh = dt.getHours();
                        var mm = dt.getMinutes();
                        var ss = dt.getSeconds();
                        return `${format(hh)}:${format(mm)}:${format(ss)}`;
                    }
                }
            })
        </script>
    </body>
</html>

OK,这里格式化时间的时候,我们定义了format函数去格式化不足两位的时间数字

  function format(date){
       return date < 10 ? '0'+date : date;
  }

过于笨重,因此我们可以使用字符串的一个方法padStart()(注意:该方法在低版本浏览器中会报错,坑啊)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <link rel="stylesheet" type="text/css" href="../css/bootstrap.css"/>
        <script type="text/javascript" src="../js/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <p>{{date | dateFormat}}</p>
        </div>
        <div id="box">
            <p>{{date | dateFormat}}</p>
        </div>
        <script type="text/javascript">
            // 全局过滤器是每一个vue实例都可用的
            // date(第一个参数)永远是需要处理的数据
            // padStart(length,str),length是填充长度,str是要填充的字符串,注意:这是字符串的方法,响应的还有padEnd(length,str)
            Vue.filter('dateFormat',function(data){
                var dt = new Date(data);
                var y = dt.getFullYear();
                var m = (dt.getMonth()+1).toString().padStart(2,"0");
                var d = dt.getDate().toString().padStart(2,"0");
                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}`;
            })
            var vm = new Vue({
                el: '#app',
                data: {
                    date : new Date()
                },
                methods: {}
            })
            var vm2 = new Vue({
                el : '#box',
                data : {
                    date : new Date()
                },
                methods: {},
                // 私有过滤器,就近原则,优先级高于全局过滤器
                filters:{
                    dateFormat : function(data){
                        var dt = new Date(data);
                        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 `${hh}:${mm}:${ss}`;
                    }
                }
            })
        </script>
    </body>
</html>
自定义按键修饰符

还以品牌实例为例,这里我们要点击enter键时也触发add函数

<!DOCTYPE html>
<html>
    <label>
        <!-- @keyup绑定键盘抬起事件,.enter确定Enter按键 -->
        <!-- 每个按键都有键码,也可以用按键的键码代替 -->
        Name : <input type="text" class="form-control" v-model="name" @keyup.enter="add"/>
        Name : <input type="text" class="form-control" v-model="name" @keyup.13="add"/>
    </label>
</html>

全部的按键别名

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

键值码固然好用,但好用不好记,所以我们可以自定义全局按键修饰符(了解即可)

Name : <input type="text" class="form-control" v-model="name" @keyup.f2="add"/>
<script type="text/javascript">
    Vue.config.keyCodes.f2 = 113;
</script>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <link rel="stylesheet" type="text/css" href="../css/bootstrap.css"/>
        <script type="text/javascript" src="../js/vue.js"></script>
    </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>
                        <!-- @keyup绑定键盘抬起事件,.enter确定Enter按键 -->
                        <!-- 每个按键都有键码,也可以用按键的键码代替 -->
                        <!-- Name : <input type="text" class="form-control" v-model="name" @keyup.enter="add"/> -->
                        Name : <input type="text" class="form-control" v-model="name" @keyup.f2="add"/>
                    </label>
                    <!-- add函数加不加括号都可以,需要传参时必须加括号 -->
                    <button type="button" class="btn btn-primary" @click="add">添加</button>
                    <label>
                        搜索名称关键字 :
                        <!-- 注意:Vue中所有指令,在调用的时候都以 v- 开头,包括自定义的指令 -->
                        <input type="text" class="form-control" v-model="keywords" v-focus />
                    </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>
                    <!-- 注意:关键字过滤要根据最新的关键字,重新渲染数据,所以这里不能遍历list -->
                    <!-- 现在我们定义了一个serch方法,同时把所有关键字通过传参传递给serch方法 -->
                    <!-- 在serch方法内部通过执行for循环,把所有符合搜索关键字的数据保存到一个新数组中返回,遍历 -->
                    <tr v-for="item in serch(keywords)" :key="item.id">
                        <td>{{item.id}}</td>
                        <td>{{item.name}}</td>
                        <!-- 利用过滤器格式化时间 -->
                        <td>{{item.ctime | dateFormat}}</td>
                        <td>
                            <!-- 阻止默认行为,传参id -->
                            <a href="" @click.prevent="del(item.id)">删除</a>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
        <script type="text/javascript">
            function format(date){
                return date < 10 ? '0'+date : date;
            }
            Vue.config.keyCodes.f2 = 113;
            // 使用Vue.directive()定义全局的指令
            // 其中,参数1:指令的名称(注意:这里不需要加v-前缀),但在调用时,必须加
            // 参数2是一个对象,这个对象有一些指令相关的函数,这些函数可以在特点的阶段执行相关的操作
            Vue.directive('focus',{
                bind:function(el){ // 每当指令绑定到元素上时,会立即执行且只执行一次
                // 注意:每个函数第一个参数,永远是el,表示被绑定了指令的元素,el是一个原生的JS对象
                // 但是刚绑定指令时,还没有插入到DOM中去,这时候掉focus方法没有作用
                // 因为,只有元素插入DOM后才能获取焦点,所以不适合用bind,应该用inserted
                    // el.focus();
                },
                inserted:function(el){ // 元素插入到DOM中时执行
                    el.focus();
                },
                updated:function(){ // 当VNode更新时,会执行updated,可能触发多次
                    
                }
            })
            //  时间格式化过滤器
            Vue.filter('dateFormat',function(dateStr){
                var dt = new Date(dateStr);
                var y = dt.getFullYear();
                var m = dt.getMonth()+1;
                var d = dt.getDate();
                var hh = dt.getHours();
                var mm = dt.getMinutes();
                var ss = dt.getSeconds();
                return `${format(y)}-${format(m)}-${format(d)} ${format(hh)}:${format(mm)}:${format(ss)}`;
            })
            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中
                        var brand = {id : this.id,name : this.name,ctime : new Date()};
                        this.list.push(brand);
                        //  清空内容
                        this.id = this.name = '';
                    },
                    del(id){ // 根据id删除数据 
                        // 正常情况下可能是操作数据库执行sql语句
                        // 第一种删除处理方式
//                      this.list.forEach((elem,i)=>{
//                          if(elem.id == id){
//                              this.list.splice(i,1);
//                          }
//                      })
                        // 第二种删除处理方式,some()与forEach基本一致,some() return true 就立即停止了
//                      this.list.some((item,i) => {
//                          if(item.id == id){
//                              this.list.splice(i,1);
//                              return true;
//                          }
//                      })
                        // 第三种,使用findIndex,专门用来查找索引
                        var index = this.list.findIndex(item => {
                            if(item.id == id){
                                return true;
                            }
                        })
                        this.list.splice(index,1)
                    },
                    serch(keywords){ // 根据关键字进行数据的搜索
                        // 第一种方式(forEach,some,filter,findIndex都属于数组的新方法)
                        // forEach不能中途终止
                        // some只要返回true,就代表终止
                        // filter返回一个数组
                        // findIndex可以返回索引
                        
//                      var newList = [];
//                      this.list.forEach(item=>{
//                          if(item.name.indexOf(keywords) != -1){
//                              newList.push(item);
//                          }
//                      })
//                      return newList;
                        
                        // filter的方式
                        var newList = this.list.filter(item=>{
                            if(item.name.includes(keywords)){
                                return item;
                            }
                        })
                        return newList;
                    }
                }
            })
        </script>
    </body>
</html>
让文本框中的文字直接带颜色
<!-- 注意:Vue中所有指令,在调用的时候都以 v- 开头,包括自定义的指令 -->
<!-- 注意:这里v-color中的blue是加单引号的,代表这是一个字符串,否则会被认作v-color中东一的变量 -->
<input type="text" class="form-control" v-model="keywords" v-focus v-color="'blue'"/>
~~~
Vue.directive('color',{
    // 样式可直接绑定给元素,不管是否被插入到页面中去
    // 和样式相关的操作,一般可以在bind中执行
    bind:function(el){
        el.style.color = 'red';
    }
})

有些时候我们希望文字颜色是自定义的

<!-- 注意:Vue中所有指令,在调用的时候都以 v- 开头,包括自定义的指令 -->
<!-- 注意:这里v-color中的blue是加单引号的,代表这是一个字符串,否则会被认作v-color中东一的变量 -->
<input type="text" class="form-control" v-model="keywords" v-focus v-color="'blue'"/>

那么自定义指令如何拿到blue这个字符串呢

Vue.directive('color',{
        // 样式可直接绑定给元素,不管是否被插入到页面中去
        // 和样式相关的操作,一般可以在bind中执行
        // binding中有一些数据行可以拿
        bind:function(el,binding){
            // el.style.color = 'red';
            console.log(binding.name);//拿到的是指令名称color
            console.log(binding.value);// 拿到的是指令参数的运算结果,即1+1,拿到的是2
            console.log(binding.expression);// 拿到的是原值,即带引号的'blue'(1+1,拿到的也是1+1)
            el.style.color = binding.value;
        }
})

私有自定义指令

<div id="box">
    <p v-fontweight="'orange'" v-fontsize="'50px'">{{date}}</p>
</div>
        <script type="text/javascript">
            var vm2 = new Vue({
                el : '#box',
                data : {
                    date : new Date()
                },
                methods: {},
                // 私有自定义指令
                directives:{
                    'fontsize':{
                        bind:function(el,binding){
                            el.style.fontSize = binding.value;
                        }
                    },
                    // 简写,如下写法,直接相当于写在了bind和update中
                    'fontweight':function(el,binding){
                        el.style.color = binding.value;
                    }
                }
            })
        </script>
上一篇下一篇

猜你喜欢

热点阅读