Vue有关的computed、watch、ref、filters、directives

327 阅读2分钟

1.computed

资料查阅:我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是computed是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用methods,在重新渲染的时候,函数总会重新调用执行。

举个例子:

 <div id="app">
        <input type="text" v-model="x"><br>
        <input type="text" v-model="y"><br>
        <!-- {{add()}}   x300次-->
        {{kks}}
</div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            x: '',
            y: ''
        },
        // methods: {
        //     add: function () {
        //         return this.x + this.y + Date.now()
        //     }
        // },
        computed: {
            kks: function () {
                return this.x + this.y + Date.now()
            }
        },
    });
</script>

执行add和computed,得到效果如下

add的输出的有时间没有变,而kss的时间没有变化。

2.watch

监听目标为谁,就以谁的名字命名方法,

index.html 文件

 
 <div id="app">
        <input type="text" v-model="names"><br>
        {{sum}}
    </div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            names: 'ws',
            sum: '',
        },
        //监听器,监听的是data里面的数据变化
        watch: {
            //监听目标为谁,就以谁的名字命名方法
            names: function (newdata, oldata) {
                var xhr = new XMLHttpRequest();
                var temp = this;
                xhr.onreadystatechange = function () {
                    if (xhr.readyState == 4) {
                        if (xhr.responseText == 0) {
                            console.log("不能改")
                            //不能改
                            temp.sum = oldata
                        } else {
                            //可以改
                            console.log("可以改")
                            temp.sum = newdata
                        }
                    }
                }
                xhr.open('get', 'http://127.0.0.1:8000/?name=' + newdata);
                xhr.send();
            },
        }

    });

</script>

.index.js文件

var http = require('http');
var server = http.createServer();
server.listen(8000);
server.on('request', function (req, res) {
    var urls = require('url').parse(req.url, true);
    if (urls.pathname == '/') {
        if (urls.query.name == 'admin') {
            res.end('0')
        } else {
            res.end('1')
        }
    } else {
        require('fs').readFile('.' + urls.pathname, function (err, data) {
            res.end(data);
        })
    }

})

在文件目录下启动CMD输入node index.js,url路径为:http://127.0.0.1:8000/index.html。

在input框输入内容。当内容为admin时候,数据回过去为0,前端页面接受0.console.log不能改。 1.

2.
3.

3.ref

ref 是一个自定义节点属性的方式,this.$refs 来获取所有ref属性的节点对象,尽量不要使用 ref违背了MVVM的设计原则.

<div id="app">
        <input type="button" value="按钮" @click="dianji">
        <p ref="ks">哈哈</p>
    </div>
<script>
    // 尽量不要使用  ref违背了MVVM的设计原则
    var app = new Vue({
        el: '#app',
        data: {

        },
        methods: {
            dianji: function () {
                console.log(this.$refs.ks.innerHTML)
            }
        }

    });


</script>

4.filters

vue有私有过滤器和全局过滤器两种


    <div id="app">
        <input type="text" v-model="res">
        {{res|myf|nu}}
    </div>
    <div id="app2">
        <input type="text" v-model="res">
        {{res|myf|nu}}
    </div>

</body>
<script>
    //全局过滤器
    Vue.filter('myf', function (val) {
        return val.toUpperCase();
    })
    Vue.filter('nu', function (val) {
        var reg = /\d/g;
        return val.replace(reg, "*");
    })
    var app = new Vue({
        el: '#app',
        data: {
            res: "msg"
        },
        methods: {

        },
        //私有过滤器、局部过滤器
        // filters: {
        //     myf: function (val) {
        //         return val.toUpperCase();
        //     },
        //     nu: function (val) {
        //         var reg = /\d/g;
        //         return val.replace(reg, "*")
        //     }
        // }

    });
    var app = new Vue({
        el: '#app2',
        data: {
            res: "msg"
        },
        methods: {

        },
        //私有过滤器、局部过滤器
        // filters: {
        //     myf: function (val) {
        //         return val.toUpperCase();
        //     },
        //     nu: function (val) {
        //         var reg = /\d/g;
        //         return val.replace(reg, "*")
        //     }
        // }

    });
</script>

5.directives(自定义指令) 自定义指令.不具备双向绑定

 <div id="app">
        <input type="text" v-model="res">
        <p v-red>123</p>
        <p v-color="res">123</p>
</div>
<script>
    // Vue.directive("red", {
    //     inserted: function (el) {
    //         el.style.background = 'red';
    //     }
    // })
    var app = new Vue({
        el: '#app',
        data: {
            res: "msg",
            // green: "pink"
        },
        methods: {

        },
        //私有自定义指令
        directives: {
            red: {
                inserted: function (el) {
                    el.style.color = 'red';
                }
            },
            color: {
                inserted: function (el, elm) {
                    console.log(elm)
                    el.style.color = elm.value;
                    // elm.expression:green
                }
            },
        }
    });
</script>