我有一个动作和减速器,可以更新全局计数器。快速执行此操作。减速器为每个操作返回状态的新副本。减速器看起来像:
import { handleActions } from 'redux-actions';
import { sceneTick } from './actions';
export default (state, action) => handleActions({
[sceneTick]: (state, action) => {
return {
...state,
loop: action.payload,
}
},
我在各种React组件上使用react- redux
的connect
方法。并非所有组件都关心此循环计数器。因为我在每个刻度上都在化简器中返回新状态,所以所有订阅的组件connect
都将mapDispatchToProps
执行,这会导致不必要的React渲染调用。
这些组件之一如下所示:
const mapStateToProps = (state, props) => {
return {
viewport: state.viewport,
assets: state.assets,
};
};
export default connect(mapStateToProps, {})(Component)
即使此组件不依赖state.loop
它,也会触发重新渲染。这会导致重新渲染,过度渲染,多次渲染,不必要的渲染,性能问题以及不需要重新渲染的组件中的意外行为。
更新 我还应该补充一点,我 没有combineReducers
在这里使用,并且所有的reducer都被应用到了全状态。不确定是否相关。
Redux connect
接受一个areStatesEqual
功能选项,可用于将相等性检查范围缩小到特定的状态分支。
export default connect(
{},
{},
null,
{
areStatesEqual: (next, prev) => {
return (
prev.branch === next.branch
);
}
}
)(Component);
问题内容: 我可能缺少一些非常明显的东西,想让自己清楚。 这是我的理解。 在幼稚的react组件中,我们有&。更新时会重新渲染整个组件。大多是只读的,更新它们没有任何意义。 在订阅redux商店的react组件中,通过类似于,它每次商店更新时都会重新渲染。 react- redux 有一个帮助程序,通常通过类似这样的方法来注入状态树的一部分(组件感兴趣)和actionCreators 组件 但是,
我正在尝试使用React Redux。我遇到了这样一种情况:一个连接的组件(Coordinates.jsx)嵌套在另一个连接的组件(Canvas.jsx)中。 源代码https://github.com/RinatRezyapov/Vault-13.git(纱线安装,然后纱线开始) 在父组件画布中。jsx I在componentDidMount()中调度一个操作,该操作不可变地更改状态。 帆布js
我正在用反应原生构建一个项目。我有一个动态的玩家列表,我希望用户能够编辑。 我想实现的是: 用户输入名称 用户按enter键 我们称之为addPlayer,它添加一个播放器 新的输入出现并得到关注(通过其他功能) 我得到的是: < li >用户输入姓名 < li >用户按enter键 < li >我们调用addPlayer来添加播放器 < li >键盘开始关闭一会儿,然后在新输入出现时重新打开。
问题内容: 我正在尝试设计一个通知组件,在某些情况下通知会出现(例如连接问题,成功的修改等)。 我需要几秒钟后通知才能消失,因此我正在触发状态更改,以从通知内部的Redux状态删除通知。 我可以看到状态确实发生了变化,但是React-Redux并没有重新渲染父组件,因此通知仍然出现在DOM上。 这是我的Redux减速器: 和我的React组件(和): 问题答案: 您已经正确连接了所有内容,但是缺少
有一个案例我很困惑。 我有一个对象redux状态:{show:true,creative:{name:'a',tags:[t1,t2,t3]}。此对象已通过“react redux”的“connect”功能映射到道具。 当我改变属性“显示”或“creative.name”时,它确实会触发重新渲染。但是如果我将t0追加到"creative.tags",它就不会运行re-渲染。 我必须分配一个新变量来
在下面的示例中,我希望组件在列表更新时重新渲染。但是即使连接传递了新状态,它也不会重新呈现组件。 我知道connect执行浅层比较,但不知道如何使其比较对象的值。我找不到任何启用选项的连接示例。 我已经了解了redux连接的组件如何知道何时重新渲染?还有一些,但也没用。 我试过了 只是试图让它重新渲染任何变化。这似乎也不起作用。 输出