【问题标题】:How to re-render components when change in store in Redux?在 Redux 中更改存储时如何重新渲染组件?
【发布时间】:2017-10-26 01:14:20
【问题描述】:

我正在尝试使用 Redux 制作我的第一个应用程序,我已经制作了一个不使用 Redux 的版本,我知道这不一定需要 Redux,但我想学习 Redux。

我有一个商店,其中包含一系列待办事项,我的操作成功调度并更新了商店。

我的任务组件列表连接到存储并将数组中的每个项目呈现为它自己的组件。

在初始加载时,我的待办事项列表会显示商店初始状态中的待办事项,但是一旦我更新状态,该状态中的新项目就不会被渲染。相反,返回组件数组的 map 方法说它“无法读取未定义的属性 'map'”。

我该如何解决这个问题?

干杯。

import React from 'react';
import ReactDOM from 'react-dom';
import { createStore } from 'redux';
import { Provider } from 'react-redux';
import Container from './components/Container.js'
import TaskReducer from './reducers/Task.js'

require("./index.css");

const defaultState = {
  items: [
    "task 1",
    "task 2"
  ]
};

const store = createStore(TaskReducer, defaultState);

// Allows access to store in console log
window.store = store;

ReactDOM.render( (
  <Provider store={store}>
    <Container />
  </Provider>
  ),
  document.getElementById('wrapper')
);

import React from 'react';
import ReactDOM from 'react-dom';
import TaskList from './TaskList.js';
import { createStore, bindActionCreators } from 'redux';
import * as ActionCreators from '../actions/Task.js';
import Redux from 'redux';
import {connect} from 'react-redux'

class Container extends React.Component {
  constructor() {
    super();
  }

  render() {
    // What does this do???
    const {dispatch} = this.props;
    const deleteItem = bindActionCreators(ActionCreators.deleteTodoItem, dispatch);
    const addItem = bindActionCreators(ActionCreators.addTodoItem, dispatch);

    function _onSubmit(e) {
      e.preventDefault();
      addItem(e.target.elements.task.value);
      // Resets the form
      e.target.reset();
    }

    return (
      <div className="">
        <header className="header">
          <h1>To Do:</h1>
        </header>
          <form autoComplete="off" onSubmit={_onSubmit}>
            <input name="task" placeholder="Task" autoComplete="off"></input>
          </form>
          <TaskList />
      </div>
    );
  }
}

const mapStateToProps = state => (
	{
		items: state.items
	}
);

export default connect(mapStateToProps)(Container);

import React from 'react';
import Task from './Task';
import { connect } from 'react-redux';

let TaskList = (props) => {
  console.log('items', props.items);
  var tasks = (props.items).map( (item, key) => { return <Task data={item} key={key} listItemKey={key} /> })

  return(
    <ul className="task-list">
      {tasks}
    </ul>
  );
}

const mapStateToProps = state => (
	{
		items: state.items
	}
);

export default connect(mapStateToProps)(TaskList);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

import * as action from '../actions/Task.js'

export default function toDoItems(state = [], action) {
  switch(action.type) {
    case 'DELETE_ITEM':
      return [
        ...state,
      ];

    case 'ADD_ITEM':
      console.log('ADD ITEM');
      console.log('Submitted value = ', action.submittedValue)
      return [
        ...state,
        // Reducer gets action object item and appends to array
        action.submittedValue
      ]

    default:
      return state;
  }
}

--- 减速器---

import * as action from '../actions/Task.js'

export default function toDoItems(state = [], action) {
  switch(action.type) {
    case 'DELETE_ITEM':
      return [
        ...state,
      ];

    case 'ADD_ITEM':
      console.log('ADD ITEM');
      console.log('Submitted value = ', action.submittedValue);
      console.log('the state', state);
      return [
        ...state,
        // Reducer gets action object item and appends to array
        action.submittedValue
      ]

    default:
      return state;
  }
}

--- 行动 ---

export function addTodoItem(submittedValue) {
  return {
      type: 'ADD_ITEM',
      // The action object returned has the submittedValue
      submittedValue
  }
}

export function deleteTodoItem() {
  return {
      type: 'DELETE_ITEM',
  }
}

【问题讨论】:

    标签: reactjs redux react-redux state store


    【解决方案1】:

    我已经编辑了 TaskList 组件。您没有正确使用地图功能

    import React from 'react';
    import Task from './Task';
    import { connect } from 'react-redux';
    
    let TaskList = (props) => {
    console.log('items', props.items);
    var tasks = undefined;
    if(props.items && props.items.length > 0 ){
      tasks = props.items.map( (item, key) => { return <Task data={item} 
      key={key} listItemKey={key} /> })
    } //edited code
    
      return(
        <ul className="task-list">
          {tasks}
        </ul>
      );
    }
    
    const mapStateToProps = state => (
    	{
    		items: state.items
    	}
    );
    
    export default connect(mapStateToProps)(TaskList);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

    至于商店,请使用以下内容在您的主文件中配置商店。 ...

    import TaskReducer from './reducers/Task.js';
    import * as redux from 'redux';
    function configure(initialState = {}){
        const reducers = redux.combineReducers({
            tasks : TaskReducer 
        });
    
        let store = redux.createStore(reducers, initialState);
    
        return store;
    };
    
    const store = configure();
    // Allows access to store in console log
    window.store = store;
    
    ReactDOM.render( (
      <Provider store={store}>
        <Container />
      </Provider>
      ),
      document.getElementById('wrapper')
    );
    

    【讨论】:

    • 这可以防止错误和我的状态更新,但它仍然没有在页面上呈现任何内容。我开始认为我错过了关于 Redux 的一些非常重要的东西。看来,只要我更新状态,而状态更新正确,组件的道具就会变得未定义。
    • 在渲染方法中,如果你执行“console.log(props)”会得到什么?
    • Props 返回一个带有 items 数组和 dispatch 方法的对象。我怀疑问题可能出在我的减速器上,我现在将添加源代码。
    • 好的,我开始有所收获了。对我来说,看起来我正在将我的 reducer 传递给整个商店,因为我可以让它工作的唯一方法是返回一个内部带有 items 数组的对象。我如何获得它,以便我只通过商店的一部分而不是整个商店,或者这不可能?
    • 您的 mapStateToProps 方法是正确的。您正在返回所需的状态值,您可以分享您的任务组件吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2018-10-15
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    相关资源
    最近更新 更多