Vue3 reactive

作用:定义一个对象类型的响应式数据。

语法

const proxy = reactive(obj)
接收一个普通对象(或数组),然后返回该普通对象的响应式代理器对象(等同于2.xVue.observable()
响应式转换是“深层的”:会影响对象内部所有嵌套的属性。
内部基于 ES6Proxy 实现,通过代理对象操作源对象内部数据都是响应式的。

原理

reactive通过使用Proxy来实现响应式(数据劫持), 并通过Reflect操作源对象内部的数据。(ref中放入对象类型最终也是借助了reactive

注意:reactive使用时,在代码中需要传递一个对象,否则会抛出异常。如果想要对一个单独的变量使用响应式,可以使用ref

实例

<template>
  <div class="test-container">
    <div>
      <ul v-for="ele in eleList" :key="ele.id">
        <li>{{ ele.name }}</li>
      </ul>
      <a-button @click="addEle">添加</a-button>
    </div>
    <div>
      <ul v-for="ele in dataObj.todoList" :key="ele.id">
        <li>{{ ele.name }}</li>
      </ul>
      <a-button @click="addTodo">添加</a-button>
    </div>
  </div>
</template>

<script>
import { ref, reactive, toRefs } from 'vue'

export default {
  setup () {
    // ref
    const eleList = ref([])
    function addEle () {
      let len = eleList.value.length
      eleList.value.push({
        id: len,
        name: 'ref 自增值' + len
      })
    }

    // reactive
    const dataObj = reactive({
      todoList: []
    })
    function addTodo () {
      let len = dataObj.todoList.length
      dataObj.todoList.push({
        id: len,
        name: 'reactive 自增值' + len
      })
    }

    return {
      eleList,
      addEle,
      addTodo,
      dataObj
    }
  }
}
</script>
<style>
.test-container {
  width: 300px;
  margin: 0 auto;
}
</style>

小技巧:
可以直接将数据放入到对象中,然后通过reactive来进行包装,然后在js中就不需要.value去调用和取值了

reactive 对复杂数据进行响应式处理,它的返回值是一个 proxy 对象,在 setup 函数中返回时,可以用 toRefsproxy 对象进行解构,方便在 template 中使用。

所以,以上例子还有另一种写法:

<template>
  <div class="test-container">
    <div>
      <ul v-for="ele in eleList" :key="ele.id">
        <li>{{ ele.name }}</li>
      </ul>
      <a-button @click="addEle">添加</a-button>
    </div>
    <div>
      <ul v-for="ele in todoList" :key="ele.id">
        <li>{{ ele.name }}</li>
      </ul>
      <a-button @click="addTodo">添加</a-button>
    </div>
  </div>
</template>

<script>
import { ref, reactive, toRefs } from 'vue'

export default {
  setup () {
    // ref
    const eleList = ref([])
    function addEle () {
      let len = eleList.value.length
      eleList.value.push({
        id: len,
        name: 'ref 自增值' + len
      })
    }

    // reactive
    const dataObj = reactive({
      todoList: []
    })
    function addTodo () {
      let len = dataObj.todoList.length
      dataObj.todoList.push({
        id: len,
        name: 'reactive 自增值' + len
      })
    }

    return {
      eleList,
      addEle,
      addTodo,
      ...toRefs(dataObj)
    }
  }
}
</script>
<style>
.test-container {
  width: 300px;
  margin: 0 auto;
}
</style>

页面效果:
在这里插入图片描述

主要区别在于:
在这里插入图片描述


在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值