html5风格网站特色,详情页设计流程,深圳做外贸的公司,手机上上建设网站reactive() 还有另一种声明响应式状态的方式#xff0c;即使用 reactive() API。与将内部值包装在特殊对象中的 ref 不同#xff0c;reactive() 将使对象本身具有响应性#xff1a; 「点击按钮1」
script langts setup
import { reactive } from vuec…reactive() 还有另一种声明响应式状态的方式即使用 reactive() API。与将内部值包装在特殊对象中的 ref 不同reactive() 将使对象本身具有响应性 「点击按钮1」
script langts setup
import { reactive } from vueconst state reactive({ count: 0 })/scripttemplatediv classcontainerbutton clickstate.count点击次数加1 : {{ state.count }}/button/div
/templatestyle langscss scoped
.container {}
/style「示例效果」 响应式对象是 JavaScript 代理其行为就和普通对象一样。不同的是Vue 能够拦截对响应式对象所有属性的访问和修改以便进行依赖追踪和触发更新。 reactive() 将深层地转换对象当访问嵌套对象时它们也会被 reactive() 包装。当 ref 的值是一个对象时ref() 也会在内部调用它。与浅层 ref 类似这里也有一个 shallowReactive() API 可以选择退出深层响应性。 reactive() 返回的是一个原始对象的 Proxy它和原始对象是不相等的
const raw {}
const proxy reactive(raw)// 代理对象和原始对象不是全等的
console.log(proxy raw) // false只有代理对象是响应式的更改原始对象不会触发更新。 因此使用 Vue 的响应式系统的最佳实践是 「仅使用你声明对象的代理版本」。 为保证访问代理的一致性对同一个原始对象调用 reactive() 会总是返回同样的代理对象而对一个已存在的代理对象调用 reactive() 会返回其本身
// 在同一个对象上调用 reactive() 会返回相同的代理
console.log(reactive(raw) proxy) // true// 在一个代理上调用 reactive() 会返回它自己
console.log(reactive(proxy) proxy) // true这个规则对嵌套对象也适用。依靠深层响应性响应式对象内的嵌套对象依然是代理
const proxy reactive({})const raw {}
proxy.nested rawconsole.log(proxy.nested raw) // falsereactive() 的局限性 有限的值类型它只能用于对象类型 (对象、数组和如 Map、Set 这样的集合类型)。它不能持有如 string、number 或 boolean 这样的原始类型。 不能替换整个对象由于 Vue 的响应式跟踪是通过属性访问实现的因此我们必须始终保持对响应式对象的相同引用。这意味着我们不能轻易地“替换”响应式对象因为这样的话与第一个引用的响应性连接将丢失
let state reactive({ count: 0 })// 上面的 ({ count: 0 }) 引用将不再被追踪
// (响应性连接已丢失)
state reactive({ count: 1 })对解构操作不友好当我们将响应式对象的原始类型属性解构为本地变量时或者将该属性传递给函数时我们将丢失响应性连接
const state reactive({ count: 0 })// 当解构时count 已经与 state.count 断开连接
let { count } state
// 不会影响原始的 state
count// 该函数接收到的是一个普通的数字
// 并且无法追踪 state.count 的变化
// 我们必须传入整个对象以保持响应性
callSomeFunction(state.count)由于这些限制我们建议使用 ref() 作为声明响应式状态的主要 API。 额外的 ref 解包细节 作为 reactive 对象的属性 一个 ref 会在作为响应式对象的属性被访问或修改时自动解包。换句话说它的行为就像一个普通的属性
const count ref(0)
const state reactive({count
})console.log(state.count) // 0state.count 1
console.log(count.value) // 1如果将一个新的 ref 赋值给一个关联了已有 ref 的属性那么它会替换掉旧的 ref
const otherCount ref(2)state.count otherCount
console.log(state.count) // 2
// 原始 ref 现在已经和 state.count 失去联系
console.log(count.value) // 1只有当嵌套在一个深层响应式对象内时才会发生 ref 解包。当其作为浅层响应式对象的属性被访问时不会解包。 数组和集合的注意事项
与 reactive 对象不同的是当 ref 作为响应式数组或原生集合类型(如 Map) 中的元素被访问时它不会被解包
const books reactive([ref(Vue 3 Guide)])
// 这里需要 .value
console.log(books[0].value)const map reactive(new Map([[count, ref(0)]]))
// 这里需要 .value 访问
console.log(map.get(count).value)//输出0new Map([[count, ref(0)]] 这个理解起来就是
访问 key为count的对应value值
也就是一组键值对的结构具有极快的查找速度。ref自动解包就是无需加上.value访问比如在模版中使用会自动解包{{msg}} 不会自动解包 就是需要再后面加上一个.value才能访问到值 Map是ES6规范引入新的数据类型。