在React项目中添加redux(使用Redux重构一个简单项目)
考虑一个简单的项目,一个使用两个按钮的计数器应用程序,一个用于递增,另一个用于递减计数器值。
在实际情况下,我们使用 状态 来保存计数器值,如下所示:
在 App.js中 :
import React, {Component} from 'react'; import CounterApp from './CounterApp' class App extends Component { render() { return ( <CounterApp/> ); } } export default App;
在 CounterApp.js中 :
import React, {Component} from 'react'; class CounterApp extends Component { state = { counter: 0 }; handleIncrement = () => { this.setState(prevState => ({ counter: prevState.counter + 1 })) }; handleDecrement = () => { this.setState(prevState => ({ counter: prevState.counter - 1 })) }; render() { return ( <div> <button onClick={this.handleIncrement}>Increment</button> <p>{this.state.counter}</p> <button onClick={this.handleDecrement}>Decrement</button> </div> ); } } export default CounterApp;
一个简单而基本的示例,该示例使用react类组件实现并由两个函数处理程序(handleIncrement和handleDecrement)处理
handleIncrement
handleDecrement
还有state一个值counter
state
counter
我使用prevState它是因为这是当您强制使用this.state.in 时的最佳实践setState!
prevState
this.state.
setState
现在, Redux的 实现将是什么?
首先,您需要通过或将 redux 和 react-redux 软件包安装到项目中。npm``yarn
npm``yarn
您只需使用一行代码即可安装它们:
npm install redux react-redux --save
或与纱线:
yarn add redux react-redux
现在返回项目并使用以下名称创建3个文件:
action.js,reducer.js 和 store.js
action.js
reducer.js
store.js
打开action.js文件。我们应该为此应用程序执行两个操作。一种用于增加,另一种用于减少。
在 action.js中
const INCREMENT_COUNTER = 'INCREMENT_COUNTER'; const DECREMENT_COUNTER = 'DECREMENT_COUNTER'; const increment = () => ({type: INCREMENT_COUNTER}); const decrement = () => ({type: DECREMENT_COUNTER}); export { INCREMENT_COUNTER, DECREMENT_COUNTER, increment, decrement }
动作是简单的函数,从组件分派到redux,用于store通过化简器更改(状态)。
store
所以我们应该更改 reducer.js :
import {INCREMENT_COUNTER, DECREMENT_COUNTER} from "./action"; const initialState = { counter: 0 }; const reducer = (state = initialState, action) => { switch (action.type) { case(INCREMENT_COUNTER): return { ...state, counter: state.counter + 1 }; case (DECREMENT_COUNTER): return { ...state, counter: state.counter - 1 }; default: return state } }; export default reducer
使用redux的3条主要原则:
1-真理的单一来源。整个应用程序的状态存储在单个存储中的对象树中。 2-状态为只读。更改状态的唯一方法是发出一个动作,一个描述发生了什么的对象。 3-使用纯功能进行更改。
1-真理的单一来源。整个应用程序的状态存储在单个存储中的对象树中。
2-状态为只读。更改状态的唯一方法是发出一个动作,一个描述发生了什么的对象。
3-使用纯功能进行更改。
根据第二个原则,我们必须假定状态是不可变的,并且每种情况(在开关中)都必须单独返回状态。在返回状态中使用… state表示如果initialState将来会更改,则这些情况将正常工作(在此示例中,这是没有必要的)。
我们的行动职能是纯粹的(第三原则)
最后一个新文件 store.js :
import {createStore} from "redux"; import reducer from './reducer' const store = createStore(reducer); export default store;
现在我们应该将此商店应用于我们的App组件。因此,打开App.js文件并进行以下更改:
import React, {Component} from 'react'; import CounterApp from './CounterApp' import {Provider} from 'react-redux' import store from './store' class App extends Component { render() { return ( <Provider store={store}> <CounterApp/> </Provider> ); } } export default App;
提供包裹的CounterApp组成部分,将传播store到App与CounterApp所有其他的子组件。
CounterApp
App
最后,更改 CounterApp.js :
import React, {Component} from 'react'; import {connect} from "react-redux"; import {increment, decrement} from "./action"; class CounterApp extends Component { handleIncrement = () => this.props.dispatch(increment()); handleDecrement = () => this.props.dispatch(decrement()); render() { return ( <div> <button onClick={this.handleIncrement}>Increment</button> <p>{this.props.counter}</p> <button onClick={this.handleDecrement}>Decrement</button> </div> ); } } const mapStateToProps = state => { const counter = state.counter; return {counter} }; export default connect(mapStateToProps)(CounterApp);
我们正在使用increment&decrement操作将操作分派到redux。
increment
decrement
将state被删除,而不是状态中,我们创建一个特殊的功能mapStateToProps' and useconnect`的状态连接组件的道具。
mapStateToProps' and use
大功告成!