小编典典

将Redux添加到现有的React应用程序

reactjs

我一直在开发React应用程序,现在我需要Redux来处理它的某些方面。

阅读了一堆教程之后,我相当着迷于如何使“更智能”的组件“笨拙”以及如何将功能移入我的动作和化简器中。

因此,例如,应用程序的一个方面更多是待办事项列表样式。

我的课程之一是这样开始的:

export default class ItemList extends React.Component {
  constructor() {
    super();
    this.state = { items: [],
                   completed: [],
                  };
    this.addItem = this.addItem.bind(this);
    this.completeItem = this.completeItem.bind(this);
    this.deleteItem = this.deleteItem.bind(this);
  }

  addItem(e) {
    var i = this.state.items;
    i.push({
      text: this._inputElement.value,
      paused: false,
      key: Date.now()
    });
    this.setState({ items: i });
    e.preventDefault();
    this._inputElement.value = '';
    this._inputElement.focus();
  }

  completeItem(e) {
    this.deleteItem(e);
    var c = this.state.completed;
    c.push({
      text: e.target.parentNode.parentNode.getElementsByClassName('item-name')[0].innerHTML,
      paused: false,
      key: Date.now()
    });
    this.setState({ completed: c });
  }

  deleteItem(e) {
    var i = this.state.items;
    var result = i.filter(function(obj) {
        return obj.text !== e.target.parentNode.parentNode.getElementsByClassName('item-name')[0].innerHTML;
    });
    this.setState({ items: result });
  }

  // ... more irrelevant code here ...

  // there's a function called createTasks that renders individual items

  render() {
    var listItems = this.state.items.map(this.createTasks);

    return <div className="item-list">
      <form className="form" onSubmit={this.addItem}>
        <input ref={(a) => this._inputElement = a}
               placeholder="Add new item"
               autoFocus />
        <button type="submit"></button>
      </form>

      {listItems}
    </div>;
  }
}

因此,如您所见,这是非常繁重的逻辑。我已经开始通过<Provider>在索引文件中添加来添加Redux
,并制作了一个基本的reducers文件,该文件到目前为止还很空:

import { combineReducers } from 'redux';

const itemList = (state = {}, action) => {

};

// ... other irrelevant reducers

const rootReducer = combineReducers({
  itemList,
  // ...
});

export default rootReducer;

…而且我制作的动作文件也没有太多内容。

我一直在努力找出:

  • 我见过的大多数操作示例仅返回某种JSON,在使用组件可以使用的JSON的化简器中返回什么?
  • 我的组件逻辑中有多少是可重用的,还是我应该忘记它?重复使用尽可能多的代码的最佳方法是什么?

阅读 215

收藏
2020-07-22

共1个答案

小编典典

首先,您需要了解redux如何与react结合使用。

在开始之前,首先要了解什么是智能组件和哑组件。

智能组件

  1. 您所有的代码逻辑都需要在这里处理
  2. 它们也称为容器。
  3. 他们与商店互动(也称为状态管理)以更新您的组件。

哑巴组件

  1. 他们只是从您的容器中读取道具并为您渲染组件
  2. 这只是UI视图,不应包含任何逻辑。
  3. 所有样式/ html / css都包含在您的哑组件中。

是一篇很棒的文章,如果您仍有疑问,可以通过这篇文章来了解智能和愚蠢的组件。

好的,现在让我们尝试了解redux的工作原理:-

  • 您的智能组件(又名容器)与Redux商店进行交互
  • 您从容器中触发动作。
  • 您的动作称为api
  • 操作的结果通过减速器更新了商店
  • 您的容器通过mapStateToProps函数读取商店,并且商店中的值一旦更改,容器就会更新您的组件。

现在让我们考虑您的待办事项示例

TodoListContainer.js

class TodoListContainer extends Component {

  componentWillMount () {
    // fire you action action
  }


  render () {
    return (
      <Todos todos=={this.props.todos} />
    )
  }
}


function mapStateToProps(state) {
  const {todos} = state;
  return {
    todos;
  }
}

export default connect(mapStateToProps)(TodoListContainer)

TodoList.js

class TodoList extends Component {

  renderTodos() {
    return this.props.todos.map((todo)=>{
      return <Todo todo={todo} key={todo.id} />
    })
  }

  render () {
    return () {
      if (this.props.todos.length === 0) {
        return <div>No todos</div>
      }
      return (
        <div>
          {this.renderTodos()}
        </div>
      )
    }
  }
}

export default class TodoList

Todo.js

class Todo extends Component {

  render () {
    return (
      <div>
        <span>{this.props.todo.id}</span>
        <span>{this.props.todo.name}</span>
      </div>
    )
  }
}

减速器

export default function todos(state={},action) {
  switch (action.type) {
    case 'RECEIVE_TODOS':
       return Object.assign(state,action.todos);
  }
}

行动

function fetchTodos() {
  return(dispatch) => {
      axios.get({
    //api details
    })
    .then((res)=>{
      dispatch(receiveTodos(res.todos))
    })
    .catch((err)=>{
      console.warn(err)
    })
  }
}

function receiveTodos(todos) {
  return {
    type: 'RECEIVE_TODOS',
    todos
  }
}

现在,如果您已阅读redux文档,您将看到动作返回对象,那么我将如何在其中调用返回函数而不是对象的api。为此,我使用了redux
thunk,您可以在此处阅读有关内容。

我为您提供了一个示例,您可以在其中获取待办事项。如果要执行其他操作,例如deleteTodo,addTodo,modifyTodo,则可以在适当的组件中执行此操作。

  1. DeleteTodo-您可以在TodoListContainer中进行。
  2. AddingTodo-您可以在TodoListContainer中进行。
  3. 更改状态(已完成/待处理)-您可以在TodoListContainer中进行。
  4. ModifyingTodo-您可以在TodoContainer中进行。

您也可以在此处查看详细示例,但在此之前,我想说的是应该先了解redux的基础知识,您可以在此处找到

PS:我是即时编写代码的,因此它可能无法正常工作,但应稍作修改即可工作。

2020-07-22