Side Effect
Vue 文档中有一段表述:
这个 update() 函数会产生一个副作用,或者就简称为作用 (effect),因为它会更改程序里的状态。
这和我理解的副作用概念不太一样。
React 中的副作用,指的其实是超过 「React 范畴」的逻辑。
比如:
- 数据请求
- 订阅外部事件
- 手动更改 React 组件之外的状态
最典型的事例是修改 localStorage。
js
localStorage.setItem('name', 'John');这时候我开始思考「副作用」的定义。
在计算机科学中,函数副作用(side effect)指当调用函数时,除了返回可能的函数值之外,还对主调用函数产生附加的影响。例如修改全局变量(函数外的变量),修改参数,向主调方的终端、管道输出字符或改变外部存储信息等。
所以,副作用,指的是在函数执行过程中,除了正常返回值之外,对外部环境产生的其他影响。而这个外部环境存在一个scope(作用域)的概念。
例如,在 React 中,scope 是除了 React 这个内部系统之外的任何事物。 在 Vue 中,作用域可以是某个响应式变量,或者是某个组件。
比如
js
const name = ref('Ray')
const fullName = ref('')
watch(name, (val) => {
fullName.value = `${val}-D-Song`
})在这里,响应式变量 name 自身就是一个 scope,修改 name 时会同步更新 fullName,而这个更新操作就是副作用。