zoukankan      html  css  js  c++  java
  • Vue指令

    指令

    形式:元素的属性
    自定义指令允许你对DOM元素进行底层操作(其实Vue作为一个框架是面向数据的,它更支持你面向数据编程)
    内置指令和自定义指令,通过自己定义指令可以了解指令的实质

    常见的内置指令

    1. v-show| v-if|v-else-if (区别:前者:CSS:display-none控制加入了DOM Tree, 后者是没有加入DOM Tree)

    v-show-display:none.png

    2. v-for: 遍历列表,对象,整数(从1开始) (是否设置key值,动态双向绑定)
    3. v-cloak结合 display:none; 防止抖动
    4. v-bind: 动态绑定 缩写 :
    5. v-model: 一些表单元素的双向绑定
    6. v-html (XSS警告)
    7. v-text
    8. v-once
    9.** v-on 事件处理(敲黑板!划重点)** 缩写 @
    10. v-pre
    

    自定义指令使用方式:先注册后使用

    1. 符合注册指令:全局,局部(只可以在绑定的视图中使用)
    // 全局注册
    Vue.directive(id,[definition])
    
    // 局部注册 v-focus
    new Vue({
        el:"#app",
        directives: {
            focus: {
    
            }
        }
    })
    
    1. 使用指令:与Vue提供的内置指令使用方式一样。
    <div v-mydirective></div>
    // v-mydirective为自己定义的指令
    

    自定义指令的钩子函数

    1. bind 只调用一次,指令第一次绑定到元素时调用。适合做一些一次性的初始化操作
    2. inserted 被绑定元素插入父节点的时候调用。
    3. update 所在组件的vnode更新时调用,
    4. componentUpdated 指令所在组件的VNode及其子VNode全部更新后调用
    5. unbind 只调用一次,指令与该元素解绑时调用。
    <div id="app">
            <input type="text" v-focus>
        </div>
        <script src="../node_modules/vue/dist/vue.js"></script>
        <script>
            // 注册全局的自定义属性
            Vue.directive('focus', {
                inserted: function(el) {
                    // 聚焦元素
                    el.focus();
                }
            });
            const app = new Vue({
                el: "#app",
    
            });
        </script>
    

    钩子函数中的参数

    1. el: 指令所绑定的元素,可以用来直接操作DOM
    2. binding: 一个对象,含有一下属性:
      • name 指令名字(除去v-前缀的,v-focus中 name为focus)
      • value 指令绑定的值,v-focus="1+2" value = 2
      • oldValue 前一个值 仅仅在 update和componentUpdated钩子中可以用。
      • expression 字符串形式的指令表达式, v-focus="1+2" expression="1+1"
      • arg 指令传递的参数 v-my:foo 其中arg为foo
      • modifiers 修饰符
      • vnode Vue编译后生成的虚拟节点
      • odlVnode上一个虚拟节点 仅仅在update和componentUpdated钩子中使用
    <body>
        <div id="app" v-demo:foo.a.b="message">
        </div>
        <script src="../node_modules/vue/dist/vue.js"></script>
        <script>
            // 定义全局的指令
            Vue.directive('demo', {
                bind: function(el, binding, vnode) {
                    var s = JSON.stringify;
                    el.innerHTML =
                        '1. name: ' + s(binding.name) + '<br />' +
                        '2. value: ' + s(binding.value) + '<br />' +
                        '3. expression: ' + s(binding.expression) + '<br />' +
                        '4. argument: ' + s(binding.arg) + '<br />' +
                        '5. modifiers: ' + s(binding.modifiers) + '<br />' +
                        '6. vnode keys: ' + Object.keys(vnode).join(', ') + '<br />';
                }
    
                // Object.keys() 获取对象的全部属性
            });
            const app = new Vue({
                el: "#app",
                data: {
                    message: "Vue.js很牛逼!"
                },
                methods: {
    
                }
            })
        </script>
    </body>
    

    函数简写

    如果bind和update的行为相同,且该自定义指令只需要使用这两个函数,可以简写。

        <div id="app">
            <p v-color-swatch="color">我就是很帅!</p>
        </div>
        <script src="../node_modules/vue/dist/vue.js"></script>
        <script>
            // 这里的function代替了bind和update钩子函数
            Vue.directive('color-swatch', function(el, binding) {
                console.log(el, binding);
                el.style.backgroundColor = binding.value;
            });
            const app = new Vue({
                el: "#app",
                data: {
                    color: "red"
                }
            })
        </script>
    

    给指令传入对象字面量

    传给指令的值可以使任何合法的JavaScript表达式
    传入对象字面量

    
    <div id="app">
            <div v-demo="{color:'white',text:'hello!'}"></div>
        </div>
        <script src="../node_modules/vue/dist/vue.js"></script>
        <script>
            Vue.directive('demo', function(el, binding) {
                const {
                    color,
                    text
                } = binding.value;
                console.log(color);
                console.log(text);
            })
            const app = new Vue({
                el: "#app"
            })
        </script>
    

    自定义指令的实战:模拟天猫导航

    https://github.com/suckitfa/dropdown-menu.git
    

    参考

    - 《Vue.js从入门到实战》
    - Vue官方文档
    慢慢来,比较快!基础要牢,根基要稳!向大佬致敬!
  • 相关阅读:
    C++:变量声明和定义的关系
    Docker 方式搭建 zookeeper + kafka 集群
    Centos7.6系统下docker的安装
    CentOS7服务器下安装配置SSL
    《深入浅出密码学》|ing
    车联网入侵检测技术(持续更新)
    Hive的安装及交互方式
    Centos7中安装MySQL5.7记录
    Zookeeper-分布式锁代码实现
    【Java】String字符串的最大长度
  • 原文地址:https://www.cnblogs.com/rookie123/p/14757877.html
Copyright © 2011-2022 走看看