Vue基础3

vue监视属性的原理

收集表单

内置指令


vue监视属性的原理

更新时的一个问题

vue监视:1.watch(程序员的监视),2.修改data数据,模板里用到的地方自动发生改变;两个底层原理是一样的,后者是vue自动的监视

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.js"></script>
</head>

<body>
    <div id="root"> 
    <h2>人员列表</h2>
    <button @click="updataMei">更新马冬梅</button>
    
        <ul>
            <li v-for="p in persons" :k="p.id">
                {{p.name}}-{{p.age}}-{{p.sex}}
            </li>
        </ul>
    </div>

    <script type="text/javascript">
        new Vue({
            el: "#root",
            data: {
                persons: [
                    { id: "001", name: "马冬梅", age: 19, sex: "女" },
                    { id: "002", name: "周冬雨", age: 20, sex: "女" },
                    { id: "003", name: "周杰伦", age: 21, sex: "男" },
                    { id: "004", name: "温兆伦", age: 22, sex: "男" }
                ],
            },
            methods: {
                updataMei(){
                    // this.persons[0].name="马老师"//奏效
                    // this.persons[0].age=50//奏效
                    // this.persons[0].sex="男"//奏效
                 this.persons[0]={id:"001",name:"马老师",age:50,sex:"男"}//不奏效
                }
            }
        })
    </script>
</body>
</html>

单独赋值,开发者工具能检测到,并且页面显示如下图:

 整体赋值,vue开发者工具检测不到,如下图:但其实他是改变了的,只不过vue没有检测得到,可以通过vm实例查看

 但是奇怪的是,如果完成了改变再打开开发者工具,开发者工具是能展现的;如果开发者工具已经在工作了再去改变,vue开发者工具是不能检测到的


vue监测数据改变的原理

对象:

data里的数据变成vm里的:

data加工成_data实际上是添加了set,代表可以做响应式,引起模板的重新解析,然后数据代理成为vm里的

加工的时候,对象的对象....只要还是对象,很多层都会检测到,并且都设置set

data一变调用set,set一调重新解析模板,模板一解析生成新旧dom,新旧dom再对比,生成新的页面

Vue.set的使用:vm.$set也可以

如果在编写vue代码时,忘记写data里的某个属性,想要再去添加(不可以动data),可以借助Vue.set(在哪里添加,添加什么,添加的值),但是第一个参数不能是vm或者data,。不能vm.student.sex='男'更不能直接vm.sex='男',因为vm里的属性都是数据代理得来的,而且这两种方法vue不会提供set,也就是说没有响应式。

 


数组:

数组里面没有get,set,所以修改数组是没有响应式的,对应更新时的那个问题

数组的改变,vue提供的是:用数组的一些方法对他进行改变,这个vue是可以检测到的 

因为他做了两件事:1.数组函数本来的功能 2.重新解析模板

  

当然啦,也可以用vue.set或者vm.$set对数组进行改变

总结:

数据劫持:把data劫持过来变成_data

 


收集表单

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.js"></script>
</head>

<body>
    <div id="root">
        <form action="">
         账号:<input type="text" v-model="account"><br>
         密码:<input type="password"  v-model="password"><br>
         性别:
         男<input type="radio" name="sex" v-model="sex" value="man">
         女<input type="radio" name="sex" v-model="sex" value="female"><br>
         爱好:
         学习<input type="checkbox" v-model="hobby" value="study">
         打游戏<input type="checkbox" v-model="hobby" value="game">
         吃饭<input type="checkbox" v-model="hobby" value="eat"><br>
         所属校区:
         <select v-model="city">
             <option value=""  >请选择校区</option>
             <option value="beijing"   >北京</option>
             <option value="shanghai"  >上海</option>
             <option value="wuhan"  >武汉</option>
         </select>
         <br>
         其他信息:
         <textarea v-model="other"></textarea><br>
         <input type="checkbox" v-model="agree">阅读并接受<a href="">《用户协议》</a>
         <button>提交</button>
        </form>
     </div>
</body> 
 <script type="text/javascript">
        new Vue({
            el:'#root',
            data:{
                account:'',
                password:'',
                sex:'',
                hobby:[],
                city:'',
                other:'',
                agree:''
            }
        })
    </script>
</html>


内置指令

v-text:

1.向其所在的节点中渲染文本内容

2.与插值语法的区别:v-text会替换掉节点中的所有内容,{{学习}}不会

v-html:与v-text不同的是,他会解析里面的标签,而v-text识别不了标签,全部当成文本

v-cloak:(没有值)

1.本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性

2.使用css [v-cloak]{display:none;}配合可以解决网速慢时页面展示出{{xxx}}的问题

v-once:(没有值)

1.v-once所在节点在初次动态渲染后,就视为静态内容了

2.以后数据的改变不会引起v-once所在结构的更新,可以用与优化性能

v-pre:(没有值)

1.跳过其所在节点的编译过程

2.可利用它跳过:没有指令语法、插值语法的节点,会加快编译

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值