学习Vue时候随手写的东西-1
本文最后更新于:2023年6月25日 晚上
响应式
使用reactive()
创建响应式对象或数组
我们可以使用reactive()
函数创建一个响应式对象或数组:
1 |
|
可以看到如果要访问state
的属性的话,直接使用.
运算符即可。
值得注意的是,reactive()
返回的是一个原始对象的 Proxy,它和原始对象是不相等的:
1 |
|
由于JS会自动转型,所以在JS中,两个等号是会先将两边的值转为布尔型再进行比较,而三个等号就是严格判定,可以说JS中的三个等号等于其他语言中的两个等号。reactive()
API有两条限制:
- 仅对对象类型有效(对象、数组和
Map
、Set
这样的集合类型),而对string
、number
和boolean
这样的原始类型无效。 - 因为 Vue 的响应式系统是通过属性访问进行追踪的,因此我们必须始终保持对该响应式对象的相同引用。这意味着我们不可以随意地“替换”一个响应式对象,因为这将导致对初始引用的响应性连接丢失,同时这也意味着当我们将响应式对象的属性赋值或解构至本地变量时,或是将该属性传入一个函数时,我们会失去响应性。
使用ref()
定义响应式变量
reactive()
的种种限制归根结底是因为JavaScript
没有可以作用于所有值类型的 “引用” 机制。为此,Vue提供了一个ref()
方法来允许我们创建可以使用任何值类型的响应式ref:
1 |
|
ref()
将传入参数的值包装为一个带.value
属性的ref对象:
1 |
|
当ref在模板中作为顶层属性被访问时,它们会被自动“解包”,所以不需要使用.value
。下面是之前的计数器例子,用ref()
代替:
1 |
|
跟响应式对象不同,当ref作为响应式数组或像Map
这种原生集合类型的元素被访问时,不会进行解包。
1 |
|
一定要注意解包!看下面!
请注意,仅当ref是模板渲染上下文的顶层属性时才适用自动“解包”。例如,foo
是顶层属性,但object.foo
不是。
1 |
|
不同点
reactive()
容易丢失响应式链接,比如:
1 |
|
但是ref()
就不是了,把上边的换成ref的话count
是会跟着n
一起变的。
以及传入函数中,也会丢失reactive()
响应性,但是ref()
不会:
1 |
|
在上面的例子中,如果函数中用到传入的值的话,state.count
一直是0,无论它之后是否变化。而obj.foo
传进去的是响应式对象,利用.value
就能跟踪状态取最新值。
希望本文章能够帮到您~