Vue数据响应原理

2019-03-02  本文已影响0人  码上行动

我们知道当Vue data实例对象下的数据发生改变,视图会随之改变,那么它是遵循的什么底层原理呢?相信大家一定很好奇,那么接下来就让我们一探究竟吧~

<div id="app">
    <h1>title : {{title}}</h1>   //title : xx 视图随之更新
    <h1>url : {{url}}</h1>     //url : www.baidu.com
</div>
<script type="text/javascript">
    var data = { title: "百度", url: "www.baidu.com", }
    var app = new Vue({
        el: '#app',
        data: data
    })

    修改app  data实例对象下的title属性
    app.title= "xx"
    document.write(data.title )
</script>

如上图所示,在js中手动修改了data实例对象下title的值 ,视图会随之显示新值。

接下来我们用ES5当中的get和set演示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="box">hello</div>
</body>
<script>

 var obj={
    name:"veb",
    get_name:function(){
        console.log("有人访问了name的值")
        return this.name;
    },
    set_name:function(val){
        console.log("有人修改了name的值")
        this.name=val;
     }
 }

 console.log(obj.get_name())
</script>

在控制台输入obj.get_name()可获取neme的值,输入obj.set_name(123)可修改neme的值 ,视图随set设置更新,可见vue数据响应原理(双向绑定原理):给data中的属性添加set,依赖于ES5的defineproperty;

Vue.set()

Vue内置的set方法

官方解释是:设置对象的属性。如果对象是响应式的,确保属性被创建后也是响应式的,同时触发视图更新。这个方法主要用于避开 Vue 不能检测属性被添加的限制。

Vue.set(a,b,c)

a是要更改的数据

b是数据的第几项

c是更改后的数据

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="vue.js"></script>
</head>
<body>
    <div id="app">
         <ul>
             <li v-for="item in listData">{{item}}</li>
        </ul>
        <a href="" v-text="he" @click="changeData()"></a>
    </div>
</body>
<script>
    new Vue({
        el:"#app",
        data:{
            he:"点我",
            listData:["a","b","c"]
          },
        methods:{
              changeData () {
                  Vue.set(this.listData,0,'X')
              }
            }
    })
</script>
</html>

效果如下:

1.png
上一篇下一篇

猜你喜欢

热点阅读