Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 如何在redux中设置初始状态_Reactjs_Redux_React Redux - Fatal编程技术网

Reactjs 如何在redux中设置初始状态

Reactjs 如何在redux中设置初始状态,reactjs,redux,react-redux,Reactjs,Redux,React Redux,我想知道如何在redux中设置存储的初始状态。我举个例子。我试图修改代码,使TODO具有初始化的值 const todoApp=组合减速机({ 待办事项, 可视性过滤器 }, { todos:[{id:123,文本:'hello',已完成:false}] }) 在文件之后: 但是它不起作用,我也不太清楚为什么。它需要成为createStore的第二个参数: const rootReducer=combinereducer({ 待办事项:待办事项, visibilityFilter:visibi

我想知道如何在redux中设置存储的初始状态。我举个例子。我试图修改代码,使TODO具有初始化的值

const todoApp=组合减速机({
待办事项,
可视性过滤器
}, {
todos:[{id:123,文本:'hello',已完成:false}]
})
在文件之后:


但是它不起作用,我也不太清楚为什么。

它需要成为
createStore
的第二个参数:

const rootReducer=combinereducer({
待办事项:待办事项,
visibilityFilter:visibilityFilter
});
常量initialState={
todos:[{id:123,文本:'hello',已完成:false}]
};
const store=createStore(
减根剂,
初始状态
);

您可以在减速器中设置初始状态


根据@ctrlplusb的回答,这种方法之所以有效,是因为

const rootReducer = combineReducers({
  todos: todos,
  visibilityFilter: visibilityFilter
});
第一个
todos
是一个键,它将第二个
todos
设置为减速器的返回值。还原程序总是在创建存储时运行一次。这将初始化您的全局存储

在创建存储时会调度一个操作。这就是如何在存储中初始化每个组合减速器中提供的初始状态。如果检查redux开发工具,您将看到调度的第一个操作是“@@redux/INIT{something}”

在redux的文档中,在文件末尾附近有一个分派({type:ActionTypes.INIT})

看这里

请参阅我在stackoverflow上提出的问题/答案,以澄清回答:

到目前为止,已经有了很好的答案,但让我来冰蛋糕吧;也许是为了给你一个深入的分析,这样你就不会只是复制StackOverflow代码,而不知道你的程序为什么会工作

实现这一目标的主要方法有两种,即: 1.使用createStore方法。它接受可选的第二个参数(PrepreedState值)

如果调用
createStore
而不调用
preload状态
,则会将
状态初始化为{}
因此,减速器将接收
未定义的
作为其状态值。 这就引出了第二种方法

  • 您可以在
    减速器
    处进行设置<通过查看传入的
    状态参数(如果
    createStore
    未使用
    initialState
    调用
    createStore
    ,则该参数将是未定义的),并返回希望用作默认值的值,code>还原程序也可以设置
    initialState
  • 方法2的缺点在有大量数据的情况下是明显的;比如一个巨大的待办事项列表,您希望将其作为
    initialState
    “应用程序范围”传递。方法2将带来大量的重复,因为您必须在所有的还原器中执行相同的操作。这是主要的缺点。但是,当您只想将
    initialState设置为{}
    时,它非常流行,这是一种常见的模式


    这里有一个4分钟的阅读,以便更好地理解:

    有什么理由更喜欢@ctrlplusb而不是这一个吗?实际上,jmancherje是redux建议的:是的,你肯定应该定义还原剂的默认状态,我只是认为OP正在寻找一个与全存储再水化(例如SSR/localstorage)相关的解决方案。github链接已断开。您可能应该链接到实际提交,而不是某个分支,因为这些分支可以更新。如果我没有在reducer中指定默认状态值并向
    createStore
    提供初始状态,则状态设置不正确。
    const rootReducer = combineReducers({
      todos: todos,
      visibilityFilter: visibilityFilter
    });
    
    const store = createStore(counter) // createStore without preloadedState
    const initialState = {} // or in your case:
    const initialState = {
                             initialTodos = [{id:123, text:'hello', completed: false}]
                         }
    const store = createStore(counter, initialState) // create store with preloadedState
    
    const initialState = {} // a common pattern but in your case:
    const initialState = {
                             initialTodos = [{id:123, text:'hello', completed: false}]
                         }
    function todoReducer(state = initialState, action) {
      switch (action.type) {
        case // your type:
          return ...
        default:
          return state
      }
    }