参考答案:
redux
是用于数据状态管理,而react
是一个视图层面的库
如果将两者连接在一起,可以使用官方推荐react-redux
库,其具有高效且灵活的特性
react-redux
将组件分成:
通过redux
将整个应用状态存储到store
中,组件可以派发dispatch
行为action
给store
其他组件通过订阅store
中的状态state
来更新自身的视图
使用react-redux
分成了两大核心:
在redux
中存在一个store
用于存储state
,如果将这个store
存放在顶层元素中,其他组件都被包裹在顶层元素之上
那么所有的组件都能够受到redux
的控制,都能够获取到redux
中的数据
使用方式如下:
1<Provider store = {store}> 2 <App /> 3<Provider>
connect
方法将store
上的getState
和 dispatch
包装成组件的props
导入conect
如下:
1import { connect } from "react-redux";
用法如下:
1connect(mapStateToProps, mapDispatchToProps)(MyComponent)
可以传递两个参数:
mapStateToProps
mapDispatchToProps
把redux
中的数据映射到react
中的props
中去
如下:
1const mapStateToProps = (state) => { 2 return { 3 // prop : state.xxx | 意思是将state中的某个数据映射到props中 4 foo: state.bar 5 } 6}
组件内部就能够通过props
获取到store
中的数据
1class Foo extends Component { 2 constructor(props){ 3 super(props); 4 } 5 render(){ 6 return( 7 // 这样子渲染的其实就是state.bar的数据了 8 <div>this.props.foo</div> 9 ) 10 } 11} 12Foo = connect()(Foo) 13export default Foo
将redux
中的dispatch
映射到组件内部的props
中
1const mapDispatchToProps = (dispatch) => { // 默认传递参数就是dispatch 2 return { 3 onClick: () => { 4 dispatch({ 5 type: 'increatment' 6 }); 7 } 8 }; 9} 10
1class Foo extends Component { 2 constructor(props){ 3 super(props); 4 } 5 render(){ 6 return( 7 8 <button onClick = {this.props.onClick}>点击increase</button> 9 ) 10 } 11} 12Foo = connect()(Foo); 13export default Foo;
整体流程图大致如下所示:
可以根据项目具体情况进行选择,以下列出两种常见的组织结构
角色如下:
参考如下:
1reducers/ 2 todoReducer.js 3 filterReducer.js 4actions/ 5 todoAction.js 6 filterActions.js 7components/ 8 todoList.js 9 todoItem.js 10 filter.js 11containers/ 12 todoListContainer.js 13 todoItemContainer.js 14 filterContainer.js
使用redux
使用功能组织项目,也就是把完成同一应用功能的代码放在一个目录下,一个应用功能包含多个角色的代码
Redux
中,不同的角色就是reducer
、actions
和视图,而应用功能对应的就是用户界面的交互模块
参考如下:
1todoList/ 2 actions.js 3 actionTypes.js 4 index.js 5 reducer.js 6 views/ 7 components.js 8 containers.js 9filter/ 10 actions.js 11 actionTypes.js 12 index.js 13 reducer.js 14 views/ 15 components.js 16 container.js
每个功能模块对应一个目录,每个目录下包含同样的角色文件:
其中index
模块用于导出对外的接口
1import * as actions from './actions.js'; 2import reducer from './reducer.js'; 3import view from './views/container.js'; 4 5export { actions, reducer, view };
导入方法如下:
1import { actions, reducer, view as TodoList } from './xxxx'
最近更新时间:2024-08-10