react redux 二次开发流程
在一个大项目中如何引入redux及其相关技术栈(react-redux redux-thunk redux-immutable ),已经成为react前端工程师不可或缺的技能,下面通过实现一个简单的todolist效果,来介绍相关流程
1.引入redux进行应用数据管理,安装相关依赖
yarn add redux react-redux redux-thunk redux-devtools-extension
2.创建好store.js、reducer.js、action.js、action-types.js
/*
redux最核心的管理对象store
*/
import {createStore} from 'redux'
import reducer from './reducer' const store = createStore(reducer, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__())
// 向外默认暴露store
export default store
2) reducer.js
import {CHANGEINPUT,ADDITEMS } from './action-types' const defalutState = {
inputValue : 'wuxiaohui',
list :[]
} export default (state = defalutState,action) =>{
if(action.type === CHANGEINPUT){
let newState = JSON.parse(JSON.stringify(state))//深拷贝
newState.inputValue = action.value
return newState
}
if(action.type === ADDITEMS){
let newState = JSON.parse(JSON.stringify(state))
newState.list.push(newState.inputValue)
newState.inputValue = ''
return newState
} return state
}
3)action.js
import {CHANGEINPUT,ADDITEMS } from './action-types' export const inputChange = (e)=>({
type:CHANGEINPUT,
value:e.target.value
}) export const clickButton = ()=>({
type:ADDITEMS
})
4)action-types.js
/*
包含n个action type常量名称的模块
*/
export const CHANGEINPUT = 'change_input'
export const ADDITEMS = 'add_item'
3.创建todolistui组件
//把TodoList改为UI组件-提高性能 import React from "react"; const TodoListUI =(props)=>{
// 接收connect连接器映射传递的属性和函数
let {inputValue ,inputChange,clickButton,list} = props;
return ( <div>
<div>
<input value={inputValue} onChange={inputChange} />
<button onClick={clickButton}>提交</button>
</div>
<ul>
{
list.map((item,index)=>{
return (<li key={index}>{item}</li>)
})
}
</ul>
</div>
);
}
export default TodoListUI
4.引入react-redux进行应用数据管理
/*
入口js
*/
import React from 'react';
import ReactDOM from 'react-dom'; import App from './containers/App';
import { Provider} from 'react-redux'
import store from './redux/store' //<Provider>是一个提供器,只要使用了这个组件,组件里边的其它所有组件都可以使用store了
//声明一个App容器组件,然后这个组件用Provider进行包裹。
const AppList = (
<Provider store={store}>
<App />
</Provider>
)
ReactDOM.render(AppList, document.getElementById('root'));
import React from 'react'
import {connect} from 'react-redux' import TodoListUI from '../components/TodoListUI'
import {inputChange,clickButton} from '../redux/actions' /*
connect-连接器用来将redux管理的state数据映射成UI组件的一般属性(如输入框的值)
指定向TodoList传入哪些一般属性(属性值的来源就是store中的state)
*/
const stateToProps = (state)=>{
return {
inputValue : state.inputValue,
list:state.list
}
} /*
connect-连接器用来将redux管理的包含diaptch代码的函数映射成UI组件的函数属性的函数
(如输入的onChange事件)
可以写多个函数,用逗号隔开
*/
// 写法1
// const dispatchToProps = (dispatch) =>{
// return {
// inputChange(e){
// //派发action到store中:定义action 然后派发
// //派发后就在reducer里边,编写对应的业务逻辑了
// let action = {
// type:'change_input',
// value:e.target.value
// }
// dispatch(action)
// },
// clickButton(){
//
// let action = {type:'add_item'}
// dispatch(action)
// }
// }
// }
//export default connect(stateToProps,dispatchToProps )(TodoListUI); // 写法2
export default connect(stateToProps,{inputChange,clickButton} )(TodoListUI);
- 在redux中,全局state必须是immutable的,这点毋庸置疑是我们使用immutable来优化redux的核心
- 组件props是通过redux的connect从state中获得的,并且引入immutableJS的另一个目的是减少组件shouldComponentUpdate中不必要渲染,shouldComponentUpdate中比对的是props,如果props是原生JS就失去了优化的意义
- 组件内部state如果需要提交到store的,必须是immutable,否则不强制
- view提交到action中的数据必须是immutable
- Action提交到reducer中的数据必须是immutable
- reducer中最终处理state必须是以immutable的形式处理并返回
- 与服务端ajax交互中返回的callback统一封装,第一时间转换成immutable数据
1)安装相关依赖
yarn add immutable redux-immutable
2)在reducer中 immutable的fromJs,把defalutState 转为immutable数据
// 引入fromJS 将state数据转变为 immutable对象
const defalutState = fromJS({
inputValue : 'wuxiaohui',
list :[]
}); //immutablejs的相关接口——使用get 和set 方法来改变state
export default (state = defalutState,action) =>{
if(action.type === CHANGEINPUT){
// let newState = JSON.parse(JSON.stringify(state)) //深拷贝
// newState.inputValue = action.value
// return newState
return state.set('inputValue',action.value)
}
if(action.type === ADDITEMS){
// let newState = JSON.parse(JSON.stringify(state))
// newState.list.push(newState.inputValue)
// newState.inputValue = ''
// return newState return state.merge({
'list': state.get('list').push(state.get('inputValue')),
'inputValue': ''
}); } return state
}
3)在容器组件中App.js中映射时使用get获取相关属性值
/*
connect-连接器用来将redux管理的state数据映射成UI组件的一般属性(如输入框的值)
指定向TodoList传入哪些一般属性(属性值的来源就是store中的state)
*/
const stateToProps = (state)=>{
return {
// inputValue : state.inputValue,
// list:state.list
//因为引入了immutable,state 已变为不可变对象只能调用get或set方法
inputValue : state.get('inputValue'),
list:state.get('list')
}
}
4)redux-immutable在reducer的处理
类似这样
import { combineReducers } from 'redux';
import { reducer as headerReducer } from '../common/header/store';
import { reducer as homeReducer } from '../pages/home/store';
import { reducer as detailReducer } from '../pages/detail/store';
import { reducer as loginReducer } from '../pages/login/store'; const reducer = combineReducers({
header: headerReducer,
home: homeReducer,
detail: detailReducer,
login: loginReducer
}); export default reducer;
假如我们的reducer在header中,组件中获取数据时,用get方法
const mapStateToProps = (state) => {
//inputValue是immutable对象,不能用state.header.inputValue的形式获取,要用get()
return {
inputValue :state.header.get('inputValue'),
list:state.header.get('list')
}
}
在使用了redux-immutable 后
//combineReducers不再用rudux里的,而是redux-immutable里的,这样combineReducers里的对象就是一个immutable对象
//import {combineReducers} from 'redux'
import {combineReducers} from 'redux-immutable'
import {reducer as headerReducer} from '../common/header/store'
const reducer=combineReducers({
header:headerReducer
});
export default reducer;
获取数据的时候用get(),或者getIn()--获取结构化数据
const mapStateToProps = (state) => {
return {
//inputValue :state.header.get('inputValue'),
// list:state.header.get('list')
inputValue :state.getIn(['header','inputValue']),
list:state.getIn(['header','list'])
}
}
react redux 二次开发流程的更多相关文章
- 实例讲解基于 React+Redux 的前端开发流程
原文地址:https://segmentfault.com/a/1190000005356568 前言:在当下的前端界,react 和 redux 发展得如火如荼,react 在 github 的 s ...
- OMCS开发手册(04) -- 二次开发流程
在掌握了前面几篇关于OMCS的详细介绍后,我们就可以正式基于OMCS进行二次开发了.下面我们就从服务端和客户端的角度分别介绍开发的步骤. 一.服务端开发 抛开具体的业务逻辑而言,就OMCS的服务端的开 ...
- C#开发BIMFACE系列2 二次开发流程
系列目录 [已更新最新开发文章,点击查看详细] BIMFACE 平台是一个对外开放的平台,建筑行业的相关公司.软件公司或者有 BIM 业务需求的公司都可以注册成为开发者并使用其提供的强大功能. ...
- 【工业串口和网络软件通讯平台(SuperIO)教程】三.二次开发流程
1.1 二次开发流程图 1.2 引用相关组件 找到“开发包”,引用里边的相关组件.如下图: 1.3 开发设备驱动模块 1.3.1 开发发送协议驱动 继承SuperIO.Devi ...
- Struts2学习笔记二:开发流程
一:创建项目,添加依赖包 二:在web.xml配置核心控制器 <filter> <filter-name>struts2</filter-name> <fil ...
- 如何从零搭建一个webpack+react+redux+react-redux的开发环境一入门
阅读本文章的时候,你要有一定的基础知识储备,简单的es6知识,模块化思想知识,js基础知识,node基础知识,react等 首先执行npm init,此时我的文件叫case; 下面安装一些需要的npm ...
- Ecshop系统二次开发教程及流程演示
来源:互联网 作者:佚名 时间:03-01 16:05:31 [大 中 小] Ecshop想必大家不会觉得陌生吧,大部分的B2C独立网店系统都用的是Ecshop系统,很受用户的喜爱,但是由于Ecs ...
- PHPCMS V9 模块开发 二次开发实例 留言本
鄙人实现了PHPCMS V9 产品开发权威指南(2011官方最新版).doc中的留言板实例,并加上模块安装和卸载功能, 程序可以运行,但只实现基本功能,目的是想让和我一样徘徊在PHPCMS门口不知道从 ...
- C#开发微信公众平台开发-微信海报介绍和开发流程
“让客户发展客户”,微信海报才是微信公众平台最高明的吸粉手段,海报上有粉丝的专属二维码,有粉丝的头像及商户宣传的广告等.新粉丝扫描这个专属二维码会关注公众号,同时分享海报的粉丝会增加积分换取礼品或者优 ...
随机推荐
- Linux的权限属性信息1到10位分别什么意思
要设置权限,就需要知道文件的一些基本属性和权限的分配规则. 在Linux中,ls命令常用来查看文件的属性,用于显示文件的文件名和相关属性. #ls -l 路径 [ls -l 等价于 ...
- Calendar常用方法
import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; public class C ...
- Monad 在实际开发中的应用
版权归作者所有,任何形式转载请联系作者. 作者:tison(来自豆瓣) 来源:https://www.douban.com/note/733279598/ Monad 在实际开发中的应用 不同的人会从 ...
- Badboy - variable setter
参考: http://leafwf.blog.51cto.com/872759/1117646 http://www.51testing.com/html/00/130600-1367743.html ...
- CF988D Points and Powers of Two 数学结论题 规律 第十题
Points and Powers of Two time limit per test 4 seconds memory limit per test 256 megabytes input sta ...
- Protobuf 安装及 Python、C# 示例
01| 简介02| 安装2.1 Windows 下安装03| 简单使用3.1 编译3.2 Python 示例3.3 C# 示例 01| 简介 Protobuf(Protocol Buffers),是 ...
- Erlang模块supervisor翻译
概要: 通用监督者行为 描述: 一个实现监督者的行为模块,一个监督被称为子进程的其它进程的进程.一个子进程可以是另一个监督者或工作者进程.工作者进程通常的实现使用gen_event,gen_fsm ...
- 关于jpa的Specification自定义函数,实现oracle的decode;以及如何在静态方法中调用注入的service
如何在静态方法中调用注入的service Public class ClassA{ public static ClassA classA; @Resource private Service ser ...
- Spring Boot2 系列教程(五)Spring Boot中的 yaml 配置
搞 Spring Boot 的小伙伴都知道,Spring Boot 中的配置文件有两种格式,properties 或者 yaml,一般情况下,两者可以随意使用,选择自己顺手的就行了,那么这两者完全一样 ...
- FreeSql (四)实体特性 Fluent Api
FreeSql 提供使用 Fluent Api, 在外部配置实体的数据库特性,Fluent Api 的方法命名与特性名保持一致,如下: fsql.CodeFirst .ConfigEntity< ...