解决方案(更新):
我认为任何操作都会导致react-redux-link调用mapState函数,但是当一个操作没有改变任何事情时,情况就不是这样了。
我有一个localStorage模块,它分派操作,但不更改状态,而是写入localStorage。该模块具有容器中使用的选择器,但在状态实际更改之前不会调用这些选择器,因此只有在调度另一个更改状态的操作后,UI才会正确显示。
问题
当我把商店放在窗口(window.store=store
)上时,添加一个控制台。登录MapStateTops,然后在控制台中发送一个操作:store。分派({type:'someaction'})
然后是控制台。MapStateTops的日志不显示。
我会记住结果,但是应该调用mapStateToProps,请参见此处
完整代码在这里,示例在这里(您可以点击屏幕右下角的“控制台”链接打开控制台)。
包裹json
store.js:
import { createStore } from 'redux';
export default (initialState, reducer) => {
const store = createStore(
reducer,
initialState,
window.__REDUX_DEVTOOLS_EXTENSION__ &&
window.__REDUX_DEVTOOLS_EXTENSION__()
);
window.store = store;
return store;
};
应用程序。js
import React from 'react';
import { connect } from 'react-redux';
import './App.css';
import createStore from './store';
import { Provider } from 'react-redux';
import initCounter from './components/Counter';
import {
createWrapper,
memoize,
} from './components/@common';
const COUNTER = 'COUNTER';
const selectCounterState = state => state.myCounter;
const counter = initCounter({
actionWrapper: createWrapper(COUNTER, 'counter1'),
selectors: { myState: selectCounterState },
connect,
memoize,
});
const initialState = {
myCounter: counter.initialState,
};
const reducer = (state = initialState, action) => {
if (action.emittedBy === COUNTER) {
return {
...state,
myCounter: counter.reducer(
selectCounterState(state),
action.payload
),
};
}
return state;
};
const store = createStore(initialState, reducer);
const Counter = counter.container;
const App = () => (
<Provider store={store}>
<Counter id="counter1" parentId={[]} />
</Provider>
);
export default App;
组件/计数器/索引:
import component from './component';
const INCREASE = 'INCREASE';
const reducer = (state, action) => {
if (action.type === INCREASE) {
return { ...state, count: state.count + 1 };
}
return state;
};
const makeState = memoize =>
memoize((id, parentId, { count }) => ({
id: parentId.concat(id),
parentId,
count,
}));
const mapStateToProps = ({ myState }, memoize) => () => {
const newState = makeState(memoize);
return (state, ownProps) =>
console.log('in map state to props', new Date()) ||
newState(
ownProps.id,
ownProps.parentId,
myState(state)
);
};
export default ({
actionWrapper,
selectors,
connect,
memoize,
}) => {
const actions = {
increase: ({ id }) =>
actionWrapper({
type: INCREASE,
id,
}),
};
const container = connect(
mapStateToProps(selectors, memoize),
actions
)(component);
return {
container,
reducer,
initialState: { count: 0 },
};
};
组件/计数器/组件。js:
import React from 'react';
export default props => (
<div>
<button onClick={() => props.increase(props)}>
add
</button>
{props.count}
</div>
);
你的例子coDepen工作正常,你只需要触发一个动作,通过你的顶级警卫,并且是预期的结构,以免导致任何后续错误:
将此信息发布到codepen的控制台:
store.dispatch({emittedBy: "COUNTER", type: "COUNTER -> INCREASE", id: "counter1", payload: {type: "INCREASE", id: ["counter1"]}})
造成此问题的原因是,我有一个localStorage模块,该模块执行调度操作,但不更改状态,而是写入localStorage。
模块具有选择器,可以获取正确的数据,容器将使用这些选择器构建正确的状态,但由于调度操作没有更改redux存储中的状态,因此react redux将跳过调用my mapState函数(可能在提供程序中记录状态)。
解决方案是让根缩减器返回一个新的状态引用{... state}
,这样任何操作都将导致调用mapState函数。
我在使用JSF2.0时遇到了问题。命令按钮不调用bean,我已经阅读了balusc应答commandbutton/commandlink/ajax action/listener方法未调用或输入值未更新,但我认为我不会遇到这些情况,这就是我使用的代码: 更新1:
问题内容: 我有一个操作可以更新应用程序的通知状态。通常,此通知将是错误或某种信息。然后,我需要在5秒钟后调度另一项操作,该操作会将通知状态恢复为初始状态,因此没有通知。其背后的主要原因是提供了5秒钟后通知自动消失的功能。 我没有使用并返回其他动作的运气,也找不到在线完成的方法。因此,欢迎提出任何建议。 问题答案: 不要陷入[认为图书馆应该规定如何做每件事的陷阱。如果您想在JavaScript中执
主要内容:以下是纠正/补充内容:先来先服务(FCFS)调度算法根据其到达时间简单地调度作业。 就绪队列中第一个工作将首先获得CPU。 工作到达时间越少,工作得到的CPU就越快。 如果第一个进程的突发时间是所有作业中最长的,则FCFS调度可能会导致饥饿问题。 FCFS的优势 简单 容易 先到先得 FCFS的缺点 调度方法是非抢先式的,该进程将运行到完成。 由于算法的非抢先性,可能会出现饥饿问题。 尽管实现起来很容易,但由于平均等待
主要内容:进程控制块中保存了什么?,为什么需要调度?在像MS DOS这样的单编程系统中,当进程等待任何I/O操作完成时,CPU仍然是空闲的。 这是一个开销,因为它浪费时间并导致饥饿问题。 但是,在多程序系统中,CPU在进程的等待时间内不会保持空闲状态,而是开始执行其他进程。 操作系统必须定义CPU将被给予哪个进程。 在多程序系统中,操作系统调度CPU上的进程以获得最大的利用率,此过程称为CPU调度。 操作系统使用各种调度算法来调度过程。 这是短期调
操作系统使用各种算法来有效地调度处理器上的进程。 调度算法的目的 最大CPU利用率 公平分配CPU 最大吞吐量 最短周转时间 最短的等待时间 最短响应时间 有以下算法可用于计划作业。 1. 先来先服务 这是最简单的算法。 最短到达时间的过程将首先获得CPU。 到达时间越少,进程得到CPU的速度越快。 这是非抢先式的调度。 2. 轮循 在循环调度算法中,操作系统定义了一个时间片(片)。 所有的进程将
我有一个自定义钩子,它返回一个动作。父组件“容器”使用自定义钩子并将动作作为道具传递给子组件。 从子组件执行操作时,实际分派发生两次。现在,如果子级直接使用钩子并调用操作,则调度只发生一次。 如何复制它: 打开下面的沙盒,打开chrome上的devool,这样你就可以看到我添加的控制台日志。 https://codesandbox.io/s/j299ww3lo5?fontsize=14 主要的js