美文网首页
vue3(语法糖)reactive数据直接赋值将失去响应式

vue3(语法糖)reactive数据直接赋值将失去响应式

作者: 月下小酌_dbd5 | 来源:发表于2022-04-26 14:49 被阅读0次

    1.直接赋值导致失去响应式

    • 因为reactive数据被重新赋值后,原来数据的代理函数和最新数据的代理函数不是同一个
    <template>
      <div>
        <div v-for="(item, index) in data" :key="index">{{ item }}</div>
        <button @click="onUp">长大</button>
      </div>
    </template>
    <script lang="ts" setup>
    import { reactive } from 'vue'
    
    let data = reactive(['小猫', '小狗'])
    
    const onUp = () => {
      data = reactive(['大猫', '大狗'])
    }
    </script>
    
    • 结果:


      image.png

    2.解决方法

    • 方法一: reactive定义一个对象,对象里的每个属性都具有响应式
    <template>
      <div style="display: flex; margin-top: 30px;">
        <div v-for="(item, index) in data.animals" :key="index" style="margin-left: 10px;">{{ item }}</div>
        <button @click="onUp" style="margin-left: 10px;">长大</button>
      </div>
      <!-- user -->
    </template>
    <script lang="ts" setup>
    import { reactive } from 'vue'
    
    let data = reactive({
      animals: ['小猫', '小狗']
    })
    
    const onUp = () => {
      data.animals = ['大猫', '大狗']
    }
    </script>
    
    • 方法二:使用ref定义
    <template>
      <div style="display: flex; margin-top: 30px;">
        <div v-for="(item, index) in data" :key="index" style="margin-left: 10px;">{{ item }}</div>
        <button @click="onUp" style="margin-left: 10px;">长大</button>
      </div>
      <!-- user -->
    </template>
    <script lang="ts" setup>
    import { ref, reactive } from 'vue'
    
    let data = ref(['小猫', '小狗'])
    
    const onUp = () => {
      data.value = ['大猫', '大狗']
    }
    </script>
    
    • 结果:


      image.png

    相关文章

      网友评论

          本文标题:vue3(语法糖)reactive数据直接赋值将失去响应式

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