美文网首页VueVue.js开发技巧程序员
vue起步(3)自定义属性、过滤、指令

vue起步(3)自定义属性、过滤、指令

作者: Mx勇 | 来源:发表于2017-06-19 16:36 被阅读355次

    v-html的使用

    <div id="app">
        <div v-html="msg"></div>
    </div>
        <script type="text/javascript">
        var vm=new Vue({
            el:'#app',
            data:{
                msg:'<strong>vue.js</strong>'
            },
            methods:{
                
                }
        });
        </script>
    </body>```
    这里说的是1.0版本有三花括号写法“{{{}}}”,2.0后没有了。
    获取vue实例中的元素和数据:
    ```<body>
    <div id="app">
        {{msg}}
    </div>
        <script type="text/javascript">
        var vm=new Vue({
            data:{
                msg:'vue.js'
            },
            methods:{
                
                }
        }).$mount('#app');
        //vm.$mount('#app');
        alert(vm.$data.msg);
        vm.$el.style.background='gray';
        </script>
    </body>```
    自定义属性的获取:
     ```<body>
    <div id="app">
        {{msg}}
    </div>
        <script type="text/javascript">
        var vm=new Vue({
            aa:11,
            data:{
                msg:'vue.js'
            },
            methods:{
                }
        }).$mount('#app');
        //vm.$mount('#app');
        alert(vm.$options.aa);
        </script>
    </body>```
    计算属性的使用(computed):
    ```<body>
    <div id="app">
        {{msg}}<br/>
        {{a}}
    </div>
        <script type="text/javascript">
        var vm=new Vue({
            aa:11,
            data:{
                msg:'vue.js'
            },
            computed:{
                a:function(){
                    return 1
                }
            }
        }).$mount('#app');
    
        </script>
    </body>```
    ```<body>
    <div id="app">
        {{a}}<br/>
        {{b}}
    </div>
        <script type="text/javascript">
        var vm=new Vue({
            data:{
                a:1
            },
            computed:{
                b:{
                    get:function(){
                        return this.a+1;
                    },
                    set:function(v){
                        return this.a=v-1;
                    }
                }
                
            }
        }).$mount('#app');//挂载元素
        document.onclick=function(){
            vm.b=10;
        }
        </script>
    </body>```
    监听数据变化($watch):
    ```<body>
    <div id="app">
        {{a}}<br/>
        {{b}}
    </div>
        <script type="text/javascript">
        var vm=new Vue({
            data:{
                a:1,
                b:100
            },
        
        }).$mount('#app');//挂载元素
        vm.$watch('a',function(){
            this.b=this.a+10;
        })
        document.onclick=function(){
            vm.a=10;
        }
        </script>
    </body>```
    深度监听(主要监听对象object):
      ```<body>
    <div id="app">
        {{a}}<br/>
        {{b}}<br/>
        {{json}}
    </div>
        <script type="text/javascript">
        var vm=new Vue({
            data:{
                json:{aa:11,bb:22},
                a:1,
                b:100
            },
        
        }).$mount('#app');//挂载元素
        vm.$watch('json',function(){
            alert(1);},{deep:true})
        document.onclick=function(){
            vm.$data.json.aa=33;
        }
        </script>
    </body>```
    自定义过滤器filter:
    ```<body>
    <div id="app">
        {{a|toDou(1,2)}}
        
    </div>
        <script type="text/javascript">
        Vue.filter('toDou',function(value,a,b){
            alert(a+','+b);
            return value<10?'0'+value:''+value;
        })
        var vm=new Vue({
            data:{
                a:1,
            },
        
        }).$mount('#app');//挂载元素
        </script>
    </body>```
    自定义指令:
    ```<body>
        <div id="box">
           <span v-gray>发送到解放军</span>
        </div>
        <script>
          Vue.directive('gray',function(el){
            el.style.background='gray';
          })
            var vm=new Vue({
                data:{
                  msg:'vue.js'
                },
                methods:{
    
                }
            }).$mount('#box');
    
        </script>
    </body>```
    ```<body>
        <div id="box">
           <span v-demo-directive:gray="msg">发送到解放军</span>
        </div>
        <script>
          Vue.directive('demoDirective',{
            bind:function(el,binding,vnode){
                el.style.color='#fff';
                el.style.background=binding.arg;
                el.innerHTML=
                '指令名:' +binding.name+'<br>'+
                '指令内容value:' +binding.value+'<br>'+
                '指令绑定表达式expression:' +binding.expression+'<br>'+
                '传入指令的参数argument:' +binding.arg+'<br>'
                 console.log(binding)
          }})
            var vm=new Vue({
                data:{
                  msg:'vue.js'
                },
                methods:{
    
                }
            }).$mount('#box');
    
        </script>
    </body>```
    这里所说的有个钩子函数:
    bind:   只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
    inserted:   被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
    update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新。
    componentUpdated:   被绑定元素所在模板完成一次更新周期时调用
    unbind  只调用一次,指令与元素解绑时使用。
    
    
    钩子函数参数:
    定义对象的钩子函数参数如下
    el: 指令所绑定的元素,可以用来直接操作 DOM 。
    binding: 一个对象,包含以下属性: 
    name: 指令名,不包括 v- 前缀。
    value: 指令的绑定值, 例如: v-my-directive="1 + 1",value 的值是 2。
    oldValue: 指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
    expression: 绑定值的字符串形式。 例如 v-my-directive="1 + 1" , expression 的值是 "1 + 1"。
    arg: 传给指令的参数。例如 v-my-directive:foo, arg 的值是 "foo"。
    modifiers: 一个包含修饰符的对象。 例如: v-my-directive.foo.bar, 修饰符对象 modifiers 的值是 { foo: true, bar: true }。
    vnode: Vue 编译生成的虚拟节点。
    oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    ```Vue.directive('my-directive', {
      bind: function(){
        //做绑定的准备工作
        //比如添加事件监听器,或是其他只需要执行一次的复杂操作
      },
      inserted: function(){
        //...
      },
      update: function(){
        //根据获得的新值执行对应的更新
        //对于初始值也会调用一次
      },
      componentUpdated: function(){
        //...
      },
      unbind: function(){
        //做清理操作
        //比如移除bind时绑定的事件监听器
      }
    })```
    自定义拖拽div:
    ```<body>
        <div id="box">
           <span v-drag :style="{'width':'100px','height':'100px','background':'gray','position':'absolute','left':0,'top':0}"></span>
        </div>
        <script>
          Vue.directive('drag',{
            bind:function(el){
               el.onmousedown=function(ev){
                var disX=ev.clientX-el.offsetLeft;
                var disY=ev.clientY-el.offsetTop;
                document.onmousemove=function(ev){
                    var l=ev.clientX-disX;
                    var t=ev.clientY-disY;
                    el.style.left=l+'px';
                    el.style.top=t+'px';
                };
                document.onmouseup=function(){
                      document.onmousemove=null;
                       document.onmouseup=null;
                };
               }
          }})
            var vm=new Vue({
                data:{
                  msg:'vue.js'
                },
                methods:{
                }
            }).$mount('#box');
    
        </script>
    </body>```

    相关文章

      网友评论

        本文标题:vue起步(3)自定义属性、过滤、指令

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