vue3-to系列

57 阅读1分钟

to系列全家桶

toRef

如果原始对象是非响应式的就不会更新视图,(视图变,script里的数据会变)

如果原始对象是响应式的,会更新视图并改变数据(就是用来ref、reactive之类把数据变成响应式了)

<template>
  <div>
    <p>{{obj}}</p>
    <p>toRef非响应式:{{name}}</p>
    <button @click="changeMsg">changeMsge</button>
    <hr>
    <p>{{obj1}}</p>
    <p>toRef响应式:{{name1}}</p>
    <button @click="changeMsg1">changeMsge</button>
  </div>
</template>

<script setup lang="ts">
import { toRef,reactive,toRefs,toRaw} from 'vue'

const obj={name:'zs',age:18,like:'hs'}

const name=toRef(obj,'name')

const changeMsg=()=>{
  //obj.name="ls"
  name.value="非响应式改变"
  console.log(name);
  console.log(name.value);
}
//-------------------响应式数据测试
const obj1=reactive({name:'响应式',age:18,like:'hs'})

const name1=toRef(obj1,'name')

const changeMsg1=()=>{
  //obj1.name="响应式改变"
  name1.value="响应式改变"
  console.log(name1);
  console.log(name1.value);
}
</script> 
<style>
</style>

toRefs

批量创建 ref 对象,主要是方便我们解构使用

一般配合 reactive 使用

将响应式对象中所有属性包装为ref对象,并返回包含这些ref对象的普通对象

对reactive定义的对象进行解构,toRefs包装,包装之后的对象中每个属性都是响应式的。

<template>
  <div>
    <p>{{obj}}</p>
    <p>{{name}}</p>
    <p>{{age}}</p>
    <button @click="change">change</button>
  </div>
</template>

<script setup lang="ts">
import { toRef,reactive,toRefs,toRaw} from 'vue'

const obj=reactive({name:"zs",age:18,like:"hs"})

let {name,age,like}=toRefs(obj)

const change=()=>{
  name.value='改变后'
  age.value=17
  like.value="bs"
  console.log(name,age,like);
}
</script> 
<style>
</style>

toRaw

将响应式对象转化为普通对象

<template>
  <div>
    <p>{{obj}}</p>
    <button @click="change">change</button>
  </div>
</template>

<script setup lang="ts">
import { toRef,reactive,toRefs,toRaw} from 'vue'

const obj=reactive({name:"zs",age:18,like:"hs"})

let state=toRefs(obj)

const change=()=>{
  console.log(state);
}
</script> 
<style>
</style>