网上解析现状
npm install redux --save npm install react-redux --save
目前网上关于"链接"的抽象化解析较多,但具体到编程实现的代码示例相对匮乏。本文将跳过概念阐述,直接通过一个点击数字递增的案例,演示如何在项目中实际应用相关技术。
项目基础结构
假设读者已按照前文搭建好基础项目环境,核心代码位于app文件夹内。主要工作将在该目录下完成,保持与前期教程的目录结构一致性。
需求分析
- component -->放置组件的 - redux -->放置action && reducer - redux_lesson -->目前是放置用Provider打包出来的组件 - main.js -->程序入口
实现目标:创建一个包含数字0的div元素,点击时数字自动递增。需要明确三个关键要素:
1. View层显示数据(数字0)
2. 触发变更的操作(点击事件)
3. 数据变更机制
核心概念定义
state:驱动View变化的可变数据,本例中定义为数字变量
action:理解为改变state的"钥匙",本质是包含type字段的普通对象
state = {count:0}
reducer:处理变更的"加工车间",接收action和旧state,返回新state
store:整合前三者的管理中心,官方定义为"将它们联系到一起的对象"
代码实现步骤
increaseAction = {type:'increase'}
1. 定义初始state:{ count: 0 }
2. 创建action类型常量:const INCREMENT = 'INCREMENT'
3. 编写reducer函数处理逻辑:
function counter(state = 0, action) {
switch (action.type) {
case INCREMENT:
return state + 1
default:
}
}
let reducer = (state={count:0},action)=>{ //这里面传递进来两个参数, //一个是我们前面定义的state,如果木有传入的话,就用{count:0} //一个是我们前面定义的action,下面就要检查它的type来确定操作 let count = state.count switch(action.type){ //如果钥匙插对了孔,我们就返回进行了相应操作后的state对象 case 'increase': return {count:count+1} break //如果钥匙都不对,就返回没操作过的state default: return state } }
4. 创建store并绑定reducer:const store = createStore(counter)
视图层集成
在React组件中通过store.getState()
获取数据,通过store.dispatch({ type: INCREMENT })
触发更新。需要注意组件内需实现store订阅机制以响应状态变化。
架构优化方向
当前实现存在视图与逻辑耦合的问题。建议优化方案:
1. 将action creators抽离为独立函数
2. 使用react-redux库实现组件与store的连接
export const increaseAction = {type:'increase'}
3. 按功能模块拆分多个reducer,通过combineReducers整合
let reducer = (state={count:0},action)=>{ let count = state.count switch(action.type){ case 'increase': return {count:count+1} break default: return state } } export default reducer
工厂模式类比
将整个体系比喻为工业生产流程:
Store:集团公司总部(唯一)
'use strict' import React from 'react' import { createStore } from 'redux' import { Provider,connect } from 'react-redux' //这个index.js文件会在在下一步创建 import Index from '../component/index' import reducers from '../redux/reducer' //创建store let store = createStore(reducers) /* mapStatetoProps你可以理解成在下面connect的时候为组件提供一个props,这个props的值是redux的state */ let mapStatetoProps = (state) =>{ return {count:state.count} } //连接你的state和最外层的组件 let Content = connect(mapStatetoProps)(Index) let {Component} = React //使用Provider来把新的App组件打包出来class App extends Component{ render(){ return
} } export default App
Reducer:下属各专业工厂
Action:进入特定工厂的准入钥匙
State:流水线产出的成品
'use strict' import React from 'react' import { connect } from 'react-redux' //请注意这里面引入了action import {increaseAction} from '../redux/action' let {Component,PropTypes} = React class Index extends Component{ //这一步是检查传入的各个prop类型是否正确 ProTypes = { count:PropTypes.number.isrequired,} constructor(props){ super(props) } handleClick(){ /* 这一步输入this.props可以看到,其实里面有两个东西 在下面的render里面我们用到了this.props.count这个 那么这里我们要用到dispatch */ console.log(this.props) let {dispatch} = this.props //粗暴简单的使用 dispatch(increaseAction) } render(){ let {count} = this.props return{count}} } //样式文件,不用细看 let styles = { circle:{ width:'100px',height:'100px',position:'absolute',left:'50%',top:'50%',margin:'-50px 0 0 -5px',borderRadius:'50px',fontSize:'60px',color:'#545454',backgroundColor:'#fcfcfc',lineHeight:'100px',textAlign:'center',} } export default Index
这种架构的优势在于:当业务复杂化时,可通过新增action类型和reducer处理分支来扩展功能,而不破坏既有代码结构。每个数据修改路径都有明确的action-reducer对应关系,便于维护和调试。
版权声明:本文为 “博览广文网” 原创文章,转载请附上原文出处链接及本声明;
工作时间:8:00-18:00
客服电话
0755-88186625
电子邮件
admin@lanyu.com
扫码二维码
获取最新动态