响应式数据

87 阅读1分钟

响应式数据效果

		<div id="app"></div>
		<button onclick="fn()">change</button>
		<button onclick="look()">look</button>
		<script>
			
			var data={msg:"hello"};
			//1.获取元素
			//2.更新它的渲染属性: innerHTML  innerText
			var app=document.getElementById("app");
			app.innerHTML=data.msg;
			function fn(){
				//非响应式
				data.msg="666666";
				//响应式设计
				app.innerHTML=data.msg;
			}
			function look(){
				console.log(data.msg)
			}
			
		</script>	

app.innerHTML=data.msg;
data.msg="666666";
app节点对象的inneHTML并没有改变,即使改变了data.msg的值页面上显示的内容也不会改变这种就不具备响应式数据,除非再次操作app节点对象的inneHTML给其重新赋值页面上显示的内容才会改变。

响应式数据就是只要数据发生了改变就会重新刷新页面,改变页面的显示内容

响应式数据的设计

    <div id="app">
        <h1 id="title"></h1> 
	<p id="msg"></p>
    </div>
    <script>
        //利用 Object.defineProperty 自己实现双向数据绑定
        function MyVue(option) {
            let _myvm = {};// 这个对象会有传入函数的data对象的所有属性和属性值,就是把data对象的所有数据劫持了
            let arr = Object.keys(option.data);//获取data对象的所有成员名装入数组中,["title","msg"]
            // _myvum劫持data对象的所有数据
            for (let i = 0; i < arr.length; i++) {
                Object.defineProperty(_myvm, arr[i], {
                    set(v) {
                        //劫持,对_myvm对象的在数组中取出的arr[i]这个属性名做存值操作时就会执行set函数然后将存的值传入set函数中
                        option.data[arr[i]] = v;//该操作是存值操作,就将传入的值作为这个属性名的属性值,也就劫持了data对象的所有数据

                        //操作DOM节点刷新页面,响应-刷新页面
                        //获取节点,Vue框架底层采用了正则表达式匹配app这个模板下的所有节点然后做替换
                        let title = document.querySelector(option.el + " #title");
                        let msg = document.querySelector(option.el + " #msg");
                        title.innerHTML = _myvm["title"];//该操作是对_myvm对象取值操作,会执行get函数,get函数就会返回这个属性名的属性值然后刷新页面并显示在页面上
                        msg.innerHTML = _myvm["msg"];
                    },
                    get() {
                        return option.data[arr[i]];
                    }
                })
            }
            return _myvm;
        };
        let myvm = new MyVue({
            el: "#app",
            data: {
                title: "自己设计的响应式数据",
                msg: "myvue"
            }
        })
    </script>

如果内存中的数据变化了页面UI也会动态跟着刷新这种数据就是响应式数据。