4.1 响应式数据与副作用函数

220 阅读1分钟

副作用函数指的是会产生副作用的函数,如下面的代码所示:

function effect() {
	document.body.innerText = 'hello vue3'
}

当 effect 函数执行时,它会设置 body 的文本内容,但除了 effect 函数之外的任何函数都可以读取或设置 body 的文本内容。也 就是说,effect 函数的执行会直接或间接影响其他函数的执行,这时 我们说 effect 函数产生了副作用。副作用很容易产生,例如一个函 数修改了全局变量,这其实也是一个副作用,如下面的代码所示:

// 全局变量
let val = 1

function effect() {
	val = 2 // 修改全局变量,产生副作用 
}
console.log(val)

理解了什么是副作用函数,再来说说什么是响应式数据。假设在 一个副作用函数中读取了某个对象的属性:

const obj = { text: 'hello world' } 
function effect() { 
	// effect 函数的执行会读取 obj.text 
	document.body.innerText = obj.text 
}

如上面的代码所示,副作用函数 effect 会设置 body 元素的 innerText 属性,其值为 obj.text,当 obj.text 的值发生变化 时,我们希望副作用函数 effect 会重新执行:

obj.text = 'hello vue3' // 修改 obj.text 的值,同时希望副作用函数会重 新执行

这句代码修改了字段 obj.text 的值,我们希望当值变化后,副 作用函数自动重新执行,如果能实现这个目标,那么对象 obj 就是响 应式数据。但很明显,以上面的代码来看,我们还做不到这一点,因 为 obj 是一个普通对象,当我们修改它的值时,除了值本身发生变化 之外,不会有任何其他反应。下一节中我们会讨论如何让数据变成响 应式数据。