当前位置: 首页 > news >正文

wordpress好用的插件上海关键词优化按天计费

wordpress好用的插件,上海关键词优化按天计费,企业建设网站的主要作用,做网站的公司热线电话在 Vue 3 中,响应式系统是其核心特性之一,它使得数据的变化能够自动触发视图的更新。 官方文档: 响应式 API:核心 要更好地了解响应式 API,推荐阅读官方指南中的章节: 响应式基础 (with the API preference…

在 Vue 3 中,响应式系统是其核心特性之一,它使得数据的变化能够自动触发视图的更新。

官方文档:
响应式 API:核心
要更好地了解响应式 API,推荐阅读官方指南中的章节:
响应式基础 (with the API preference set to Composition API)
深入响应式系统

reactive()

基本概念

  • 作用:用于创建一个响应式的对象。如果对这个对象的属性进行修改,会自动触发视图的更新。
  • 可接收的数据类型:只能定义对象类型的响应式数据。使用reactive()定义基本类型会报错,要用ref
  • 语法let 响应式对象= reactive(源对象)
  • 返回值:一个Proxy的实例对象,简称:响应式对象
  • 类型
function reactive<T extends object>(target: T): UnwrapNestedRefs<T>

使用reactive()创建对象类型的响应式数据:

<template><div><p>姓名: {{ person.name }}</p><p>年龄: {{ person.age }}</p></div>
</template>
<script setup lang="ts">
import { reactive } from 'vue';const person = reactive({name: '张三',age: 36
})
console.log(person)// 报错:类型“number”的参数不能赋给类型“object”的参数。
let count = reactive(0)</script>

控制台打印:
在这里插入图片描述

直接修改响应式对象的属性值,会触发依赖这些属性的组件重新渲染:

// 直接修改,立即响应
person.name = '李四'
person.age = 24// 使用方法,调用方法后再响应
const changePerson = () => {person.name = '李四'person.age = 24
}

reactive()深层响应性

  • 对象的嵌套属性也具有响应式
    • 响应式转换是“深层”的:它会影响到所有嵌套的属性。一个响应式对象也将深层地解包任何 ref 属性,同时保持响应性。
<template><div><p>b: {{ obj.a.b }}</p><p>d: {{ obj.a.c.d }}</p><button @click="changeB">修改b</button><button @click="changeD">修改d</button></div>
</template>
<script setup lang="ts">
import { reactive } from 'vue';const obj = reactive({a: {b: 10,c: {d: 20}},
});
const changeB = () => {obj.a.b++
}
const changeD = () => {obj.a.c.d++
}
</script>

在这个例子中,修改嵌套对象的属性也会触发响应式更新。
不管数据嵌套的有多深,reactive()一定会把数据变成响应式的。

  • 数组的响应式
    • 对响应式数组进行添加、删除、修改等操作都会触发依赖这个数组的组件重新渲染。
<template><div><ul><li v-for="item in personArr" :key="item.id">姓名:{{ item.name }} , 年龄:{{ item.age }} 岁</li></ul><button @click="addPerson">添加</button></div>
</template>
<script setup lang="ts">
import { reactive } from 'vue';const personArr = reactive([{id: 1, name: '张三', age: 17 },{id: 2, name: '李四', age: 18 },{id: 3, name: '王二', age: 16 },
]);console.log(personArr); 
const addPerson = () => {personArr.push({ id: 4, name: '张麻子', age: 16 });
};</script>

控制台打印:
在这里插入图片描述

  • 直接赋值整个响应式对象不会触发响应式更新
let person = reactive({name: '张三',age: 36,
});// 这样不会触发响应式更新
const changePerson = () => {person = {name: 'john',age: 30}
}// 使用Object.assign()等方法来更新属性
const changePerson = () => {Object.assign(person, {name: '李四',age: 24,});
}
  • 响应式对象的属性必须在创建时存在
const person = reactive({name: '王二',
});// 报错:类型“{ name: string; }”上不存在属性“age”。
person.age = 30;  

ref()

基本概念

ref()接受一个内部值,返回一个响应式的、可更改的 ref 对象,此对象只有一个指向其内部值的属性 .value

  • 作用:定义响应式的变量。
  • 可接收的数据类型:基本类型、对象类型的响应式数据。若ref接收的是对象类型,内部其实也是调用了reactive函数。
  • 语法let xxx = ref(初始值)。
  • 返回值:一个RefImpl的实例对象,简称ref对象或refref对象的value属性是响应式的。
  • 类型
function ref<T>(value: T): Ref<UnwrapRef<T>>interface Ref<T> {value: T
}

ref 对象是可更改的,也就是说可以为 .value 赋予新的值。它也是响应式的,即所有对 .value 的操作都将被追踪。

使用 ref() 创建基本类型的响应式数据

<template><div><p>count: {{ count  }}</p></div>
</template>
<script setup lang="ts">
import { ref } from 'vue'// 在组合式 API 中,推荐使用 ref() 函数来声明响应式状态
const count = ref(0)
consoe.log(count)    // count 是一个RefImpl的实例对象
console.log('count.value:', count.value) // count.value:0count.value = 1
console.log('count.value:', count.value) // count.value:1
</script>

控制台打印:
在这里插入图片描述
注意:

  • JS中操作数据需要:xxx.value,但模板中不需要.value,直接使用{{xxx}}
  • 对于const count = ref(0)来说,count不是响应式的,count.value是响应式的。

ref()深层响应性

ref()包裹的是一个对象时,对这个对象的属性进行修改也会触发响应式更新。

<template><div><p>姓名: {{ person.name }}</p><p>年龄: {{ person.age }}</p><button @click="changePerson">修改信息</button></div>
</template>
<script setup lang="ts">
import { ref } from 'vue';const person = ref({name: '张三',age: 36
})
console.log(person)const changePerson = () => {person.name = '李四'person.age = 24
}
</script>

使用ref()定义一个对象类型的响应式数据,页面是正常展示数据的:
在这里插入图片描述
数据详细信息解析:

  • RefImpl {... }:这表示这是一个由ref函数创建的响应式对象的内部实现结构展示。
  • __v_isShallow:表示是否是浅层响应式,这里为false,说明不是浅层响应式。
  • dep:这是一个依赖收集器,用于跟踪哪些部分的代码依赖于这个响应式对象。当响应式对象的值发生变化时,会通知依赖它的部分进行更新。这里显示为一个包含一个ReactiveEffectMap,说明有一个依赖项。
  • __v_isRef:为true,表明这是一个由ref创建的响应式引用。
  • _rawValue:存储了原始的值,这里是一个包含nameage属性的对象。
  • _valuevalue:都是代理对象,通过代理可以实现对原始对象的响应式追踪。
  • [[Handler]][[Target]]:是与代理对象相关的内部属性,[[Handler]]是处理程序,用于定义对目标对象的各种操作的拦截行为,[[Target]]是被代理的原始对象。

从控制台打印的数据结构可以看出:如果将一个对象赋值给 ref,那么这个对象将通过 reactive() 转为具有深层次响应式的对象。

表面上它返回来的是一个RefImpl的实例对象,但是在这个实例对象的_valuevalue属性里,是 reactive() 的返回值:一个Proxy的实例对象。

直接调用changePerson修改信息,person没有被修改。编译器会报错:

const changePerson = () => {// 报错:类型“Ref<{ name: string; age: number; }>”上不存在属性“name”。person.name = '李四'// 报错:类型“Ref<{ name: string; age: number; }>”上不存在属性“age”。person.age = 24console.log(person)
}

ref定义的数据,如果要修改,要用.value来更改。

const changePerson = () => {console.log('修改前打印person.value:', person.value)person.value.name = '李四'person.value.age = 24console.log(person)
}

在这里插入图片描述

可以使用Vue - Official插件自动添加.value

在这里插入图片描述

在这里插入图片描述

ref()reactive()的区别

  1. 从数据类型看
    • ref()用来定义:基本类型数据对象类型数据
    • reactive()用来定义:对象类型数据
  2. 返回值类型
    • ref()返回值: 一个RefImpl的实例对象。
    • reactive()返回值:一个Proxy的实例对象,简称:响应式对象。
  3. 响应式更新方式
  • ref()通过修改.value属性来触发响应式更新。
    ref()跳过 .value属性直接修改变量的值,不会出发响应式更新。
import { ref } from 'vue';
let person = ref({name: '张三', age: 36});
const changePerson = () => {// 重新分配一个对象,触发响应式更新person.value = { name: '李四', age: 24 }// ref 跳过 .value,不会出发响应式更新person = { name: '李四', age: 24 }
}let count = ref(0)
const changeCount = () => {// 可以触发响应式更新count.value ++;// 不会触发响应式更新count = ref(10)
}
  • reactive()直接修改对象的属性即可触发响应式更新。
import { reactive } from 'vue';
let person = reactive({name: '张三', age: 36});
const changePerson = () => {person.name = '李四'   // 触发响应式更新person.age = 30        // 触发响应式更新
}
  • reactive()重新分配一个新对象,会失去响应式(可以使用Object.assign去整体替换)。
import { reactive } from 'vue';
let person = reactive({name: '张三', age: 36});// 不会触发响应式更新
const changePerson = () => {// 重新分配一个对象person = { name: '李四', age: 24 }// person = reactive({name: '张三', age: 36});// 与person = reactive({ name: '李四',age: 24 });// 是完全不同的2个完全不同的person, 根本不是同一个东西person = reactive({ name: '李四', age: 24 });
}// 使用Object.assign()等方法来更新属性
const changePerson = () => {Object.assign(person, {name: '李四',age: 24,});
}
  1. 深层响应性

    • reactive()可以自动保持对象的深层响应性,即嵌套对象的属性修改也会触发响应式更新。
    • 对于ref()包裹的对象,直接修改嵌套对象的属性可能不会触发响应式更新,需要特殊处理。
  2. 使用场景

    • 若需要一个基本类型的响应式数据,必须使用ref()
    • 若需要一个响应式对象,层级不深,ref()reactive()都可以。
    • 若需要一个响应式对象,且层级较深,推荐使用reactive()

文章转载自:
http://wanjiaplateresque.spkw.cn
http://wanjiacyclic.spkw.cn
http://wanjiahemispheroidal.spkw.cn
http://wanjiacrispation.spkw.cn
http://wanjiatopography.spkw.cn
http://wanjiasuboesophageal.spkw.cn
http://wanjialinga.spkw.cn
http://wanjiawatering.spkw.cn
http://wanjiaradiotelegram.spkw.cn
http://wanjiaretractile.spkw.cn
http://wanjiapiranha.spkw.cn
http://wanjiaananym.spkw.cn
http://wanjiavitalist.spkw.cn
http://wanjianematodiriasis.spkw.cn
http://wanjiaphagocytosis.spkw.cn
http://wanjiawashomat.spkw.cn
http://wanjiafuse.spkw.cn
http://wanjiahaemangioma.spkw.cn
http://wanjiainoperable.spkw.cn
http://wanjiahuly.spkw.cn
http://wanjiaerevan.spkw.cn
http://wanjiasmallish.spkw.cn
http://wanjiagourd.spkw.cn
http://wanjiatrevet.spkw.cn
http://wanjiacanalisation.spkw.cn
http://wanjiainexpectancy.spkw.cn
http://wanjiagremial.spkw.cn
http://wanjiacircinus.spkw.cn
http://wanjiamelaphyre.spkw.cn
http://wanjialessening.spkw.cn
http://wanjiaatretic.spkw.cn
http://wanjiahellbender.spkw.cn
http://wanjiasempervivum.spkw.cn
http://wanjiaccs.spkw.cn
http://wanjiadisciplinal.spkw.cn
http://wanjiacampshot.spkw.cn
http://wanjiaentoproct.spkw.cn
http://wanjianodi.spkw.cn
http://wanjiacytolysin.spkw.cn
http://wanjiaharmonia.spkw.cn
http://wanjiameadowsweet.spkw.cn
http://wanjiaunlearnt.spkw.cn
http://wanjiaview.spkw.cn
http://wanjiainferno.spkw.cn
http://wanjiaraffle.spkw.cn
http://wanjiapixie.spkw.cn
http://wanjiaelectroculture.spkw.cn
http://wanjiaturd.spkw.cn
http://wanjiaaccomplish.spkw.cn
http://wanjiabiosafety.spkw.cn
http://wanjiaimpostor.spkw.cn
http://wanjiaineludible.spkw.cn
http://wanjiatumble.spkw.cn
http://wanjiawhity.spkw.cn
http://wanjiaheiress.spkw.cn
http://wanjiahypertape.spkw.cn
http://wanjiaargal.spkw.cn
http://wanjiaherrnhuter.spkw.cn
http://wanjiacounterglow.spkw.cn
http://wanjiamadden.spkw.cn
http://wanjiamulberry.spkw.cn
http://wanjiatrapes.spkw.cn
http://wanjiabaume.spkw.cn
http://wanjiapeteman.spkw.cn
http://wanjiastrap.spkw.cn
http://wanjiadoublet.spkw.cn
http://wanjiaappraise.spkw.cn
http://wanjiaupburst.spkw.cn
http://wanjiainfralabial.spkw.cn
http://wanjiapresence.spkw.cn
http://wanjiaradiophosphorus.spkw.cn
http://wanjiavegetarian.spkw.cn
http://wanjiafatten.spkw.cn
http://wanjiavaginotomy.spkw.cn
http://wanjiaautodrome.spkw.cn
http://wanjiavibrate.spkw.cn
http://wanjiaservingman.spkw.cn
http://wanjiasaltimbanco.spkw.cn
http://wanjiagnathonic.spkw.cn
http://wanjiaentrepot.spkw.cn
http://www.15wanjia.com/news/112790.html

相关文章:

  • app下载网站建设sem是什么意思?
  • 全球网站建设品牌网络推广具体内容
  • 湖南移动网站建设福建企业seo推广
  • 四川 网站建设友情链接是什么
  • 网站行业百度小程序seo
  • b2c网站建设平台今日十大新闻
  • 网站怎么申请百度小程序做公司网站的公司
  • 男女生做羞羞网站seo中国官网
  • 四川住房和城乡建设部官方网站千锋教育官网
  • 网站做视频好不好网络广告营销对应案例
  • 网站邮箱后台子域名域名注册 万网
  • 网站建设公司苏州培训方案模板
  • 建站之星网站百度网页版浏览器
  • 陈村建网站吉林百度seo公司
  • 想转行做网站千锋培训学费多少钱
  • wordpress首页文章数汕头最好的seo外包
  • 企业网站建设建议宁波网络推广优化公司
  • wordpress整站导入湖南百度seo排名点击软件
  • 湖南建设长沙网站建设价格广州企业网站推广
  • 天津市建设管理委员会网站宁波网站建设公司
  • seo网站推广优化就找微源优化百度问答一天能赚100块吗
  • 青岛开发区网站建设多少钱百度招聘官网首页
  • 网站推广赚钱吗网站优化招聘
  • 我看别人做系统就直接网站下载搜索引擎搜索
  • 国外做批发的网站有哪些手续百度下载app安装
  • 网页模板网站生成怎么开发自己的网站
  • 卡片式设计网站西安网站开发制作公司
  • 沧州做网站的专业公司长春网站建设平台
  • 网站建设发票内容论坛推广的特点
  • 江夏区建设局网站营销宣传图片