一般来讲vue父组件的数据发生变化会触发父组件渲染,如果父组件传入子组件的props数据发生变化会触发子组件渲染,如果 vue 中 父组件的props和子组件的数据同时发生变化,子组件会渲染2次吗?
如题
一般来讲vue父组件的数据发生变化会触发父组件渲染,如果父组件传入子组件的props数据发生变化会触发子组件渲染,如果 vue 中 父组件的props和子组件的数据同时发生变化,子组件会渲染2次吗?
如题
在 Vue 中,当父组件的 props 数据发生变化时,子组件会被重新渲染。然而,子组件的数据变化并不会影响父组件的渲染次数。这是因为 Vue 的响应式原理是单向的:父组件通过 props 将数据传递给子组件,子组件内部的数据变化不会反馈给父组件。
如果父组件的 props 数据和子组件的数据同时发生变化,子组件的渲染次数取决于哪个变化先发生。如果父组件的 props 数据先发生变化,子组件会被重新渲染。如果子组件的数据先发生变化,由于 Vue 的懒加载机制,父组件可能不会感知到这个变化,因此不会触发重新渲染。
需要注意的是,如果子组件内部使用了 key 属性,并且 key 属性的值发生了变化,那么 Vue 会认为这是一个全新的子组件,会销毁旧的子组件并创建新的子组件,这样就会触发两次渲染。所以,如果需要让 Vue 感知子组件的数据变化并重新渲染,一种常用的方法是改变子组件的 key 属性值。
2 回答805 阅读✓ 已解决
1 回答850 阅读✓ 已解决
1 回答1.2k 阅读
1 回答1.1k 阅读
1 回答865 阅读
644 阅读
583 阅读
在Vue的源码中,当响应式数据发现改变的时候并不会立刻更新页面,而是执行执行queueWatcher函数,而这个函数内部维护着一个队列,而需要执行更新的组件会被推入到这个队列中,如果你在一个事件循环多次向这个队列中push同一个组件,它只会push一次,因为它每次push的时候都会拿你正在push的组件的id去跟队列中的组件的id比较,如果存在就不再push。Vue会把队列通过nextTick来执行,而nextTick也不是立刻执行的,它内部是以Promise,mutationObserver,setImmediate,setTimeout其中一个来执行,优先级就是上面的排列顺序,所以它就变成了一个异步任务。因此子组件只会更新一次。
Vue视图更新源码分析如下: