我一直在开发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文件,该文件到目前为止还很空:
<Provider>
import { combineReducers } from 'redux'; const itemList = (state = {}, action) => { }; // ... other irrelevant reducers const rootReducer = combineReducers({ itemList, // ... }); export default rootReducer;
…而且我制作的动作文件也没有太多内容。
我一直在努力找出:
首先,您需要了解redux如何与react结合使用。
在开始之前,首先要了解什么是智能组件和哑组件。
智能组件
哑巴组件
这是一篇很棒的文章,如果您仍有疑问,可以通过这篇文章来了解智能和愚蠢的组件。
好的,现在让我们尝试了解redux的工作原理:-
现在让我们考虑您的待办事项示例
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,则可以在适当的组件中执行此操作。
您也可以在此处查看详细示例,但在此之前,我想说的是应该先了解redux的基础知识,您可以在此处找到
PS:我是即时编写代码的,因此它可能无法正常工作,但应稍作修改即可工作。