最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 深入vue2响应式原理,在对象或数组新增属性无响应解决方法

    正文概述 掘金(山竹回家了)   2020-12-05   504

    前言

    vue2是如何追踪数据变化形成响应

    深入vue2响应式原理,在对象或数组新增属性无响应解决方法

    vue2响应的注意点

     <div id='app'>
        <p>{{ user.name }}</p>
        <p>{{ user.age }}</p>
        <button @click='changeName'>改变data中name属性</button>
        <button @click='addAge'>给data添加age属性</button>
      </div>
      <script>
        let vm = new Vue({
          el: '#app',
          data() {
            return {
              user: { name: '山竹' }
            }
          },
          methods: {
            changeName() {
              //如果是一开始就设定属性,绑定页面后,点击会触发
              this.user.name = '杀生丸'
            },
            addAge() {
              //非响应
              this.user.age = 18
              console.log(this.user);//age: 18,name: "杀生丸"
            }
          }
        })
      </script>
    

    解决方案

    对象

    方案一:初始时设定

    <div id='app'>
        <p>{{ user.name }}</p>
        <p>{{ user.age }}</p>
        <button @click='changeName'>改变data中name属性</button>
        <button @click='addAge'>给data添加age属性</button>
      </div>
      <script>
        let vm = new Vue({
          el: '#app',
          data() {
            return {
              user: { name: '山竹', age: '' }
            }
          },
          methods: {
            changeName() {
              //如果是一开始就设定属性,绑定页面后,点击会触发
              this.user.name = '杀生丸'
            },
            addAge() {
              this.user.age = 18
              console.log(this.user);//age: 18,name: "杀生丸"
            }
          }
        })
      </script>
    

    方案二:调用Vue.set方法

     <div id='app'>
        <p>{{ user.name }}</p>
        <p>{{ user.age }}</p>
        <button @click='changeName'>改变data中name属性</button>
        <button @click='addAge'>给data添加age属性</button>
      </div>
      <script>
        let vm = new Vue({
          el: '#app',
          data() {
            return {
              user: { name: '山竹' }
            }
          },
          methods: {
            changeName() {
              //如果是一开始就设定属性,绑定页面后,点击会触发
              this.user.name = '杀生丸'
            },
            addAge() {
              // Vue.set(原对象/数组,需要设置的新属性, 需要设置的新值)
              Vue.set(this.user, 'age', 18)
              console.log(this.user);//age: 18,name: "杀生丸"
            }
          }
        })
      </script>
    

    方案三:创建一个新的对象,替换原对象

    <div id='app'>
        <p>{{ user.name }}</p>
        <p>{{ user }}</p>
        <button @click='changeName'>改变data中name属性</button>
        <button @click='add'>给data添加新属性</button>
      </div>
      <script>
        let vm = new Vue({
          el: '#app',
          data() {
            return {
              user: { name: '山竹' }
            }
          },
          methods: {
            changeName() {
              //如果是一开始就设定属性,绑定页面后,点击会触发
              this.user.name = '杀生丸'
            },
            add() {
              // Object.assign方法的第一个参数是目标对象,后面的参数都是源对象
              // Object.assign(目标对象,原对象, 新属性)
              this.user = Object.assign({}, this.user, { skill: '铁碎牙', age: 18 })
              console.log(this.user);//age: 18,name: "山竹",skill: "铁碎牙"
            }
          }
        })
      </script>
    

    数组

    方案一:切割替换原数组

    //vm.items.splice(下标, 1, 新数组)
    vm.items.splice(indexOfItem, 1, newValue)
    

    方案二:Vue.set

    //Vue.set(原数组,需要设置的下标, 需要设置的新值)
    Vue.set(vm.items, indexOfItem, newValue)
    

    起源地下载网 » 深入vue2响应式原理,在对象或数组新增属性无响应解决方法

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元