美文网首页
数据的响应式原理

数据的响应式原理

作者: 未vv | 来源:发表于2020-03-24 18:44 被阅读0次

    组件或Vuex中store对象的state 是响应式的前提是:数据必须是提前初始化好的
    如:为对象新增属性,则view视图不会更新
    向student对象中添加一个sex属性

    <template>
      <div id="app">
        <h2>{{ $store.state.student }}</h2>
        <button @click="changeStudent">增加属性sex</button>
      </div>
    </template>
    
    <script>
    export default {
      name: 'App',
      data() {
        return {}
      },
      methods: {
        changeStudent() {
          this.$store.commit('Cstudent')
        }
      }
    }
    </script>
    
    import Vue from 'vue'
    import Vuex from 'vuex'
    
    Vue.use(Vuex)
    
    const store = new Vuex.Store({
      state: {
        student: {
          age: 18,
          name: 'xiaowang'
        }
      },
      mutations: {
        Cstudent(state) {
          console.log(state.student)  //sex属性已经存在 ,但视图不会更新,因为sex属性不是一开始就初始化好的
          state.student['sex'] = '男'
        }
      }
    })
    export default store
    
    image.png

    如何把sex属性增加到响应式系统中呢? 方式一:通过Vue.set()方法
    该方法接收三个参数("对象/数组","key/索引","修改后的值")

      mutations: {
        Cstudent(state) {
          console.log(state.student)
          // state.student['sex'] = '男'
          Vue.set(state.student, "sex", "男")
        }
      }
    
    image.png

    删除对象中某一属性值 使用delete 无法做到响应式,可以通过Vue.delete()做到响应式

    Vue.delete(state.student, 'name')
    

    方式二:以新对象替换老对象

       mutations: {
        Cstudent(state) {
          console.log(state.student)
          // state.student['sex'] = '男'
          // Vue.set(state.student, "sex", "男")
          state.student = {  //利用对象展开运算符
            ...state.student,
            sex: '男'
          }
        }
      }
    

    删除name属性可以写为

      mutations: {
        Cstudent(state) {
          state.student = {
            age: 18
          }
        }
      }
    

    相关文章

      网友评论

          本文标题:数据的响应式原理

          本文链接:https://www.haomeiwen.com/subject/fmkayhtx.html