1、什么是 rudux
2、配置 redux
3、案例分享
Redux 是针对 JavaScript应用的可预测状态容器 就是用来管理数据的。
stroe 保存数据
action领导 下达命令
reducer员工 执行命令
下载命令:
npm install redux --save
(1)index.js reducer.js action.js actionType.js
(2)在redux文件下下导入的redux是 redux 在外部就是react-redux
(3)在index.js根目录文件导入redux文件夹下创建的index文件导出的store
(4)在index.js根目录导入Provider包裹APP.js文件 在标签内导入store
(1)定义初始化的reducer对象rootReducer 所有reducer中导出的reducer全都定义在这个对象中
(2)定义初始化的state的格式为对象initialState
(3)再通过createStore把两个初始的值合并到对象store中并导出,在根目录的index中使用
(1)定义一个对象,对象内部的值设置一个初始的空
(2)定义一个函数导出 这个函数的两个参数一个是state一个是action
(3)state设置初始等于上面定义的初始化对象 action是用户提交的请求
(4)用switch方法判断actionType名返回对应的action中的数据(用户提交的数据)
(1)定义函数 export导出 return返回两个对象 一个是type类型 一个是传递的数据
(1)在action中导出每一个定义好的对象 在组件中导入
(2)引入react的connect方法
(3)在组件下面定义一个获取数据的方法mapStateToProps 参数是state,返回的是一个对象,对象内是需要获取的数据
(4)再定义一个导出数据的方法mapActionToProps 参数为dispatch,return返回一个函数 函数的value值是一个箭头函数
dispatch参数提交定义的action,action的参数再调用的地方定义。
(5)导出时候用connect方法连接获取数据和导出数据的函数,第二个括号传入请求数据的组件
1、安装redux,npm i redux
2、创建商店(store)
实例化商店对象、创建商店订单账单(属性清单)
3、操作
把值交给商店
去商店取值 store.getState() ,先监听一下store中的改变 react-redux
1、理解store(自建商店),用于统一管理项目中的所有需要共享的属性和数据
createStore()
2、理解reducer,商店中的清单,state用于存储数据,action判断数据的来源并接收数据,返回state
createStore(reducer)
3、理解组件中的store(组件中引入的商店), import store from ‘./sotre’
获取数据 store.getState()
提交数据给store store.dispatch(action) , action是要存储的对象,属性:type表示action的类型,value表示要保存的值
实时监听store中数据的改变 store.subscribe(function)
配置Redux开发环境的最快方法是使用create-react-app工具。在开始之前,确保已经安装并更新了nodejs,npm。
npm install redux
创建store目录,在store目录下新建index.js文件,键入以下内容:
import {createStore} from 'redux';
import reducer from './reducer';
const store = createStore(reducer);
export default store;
在store目录下创建reducer.js文件,键入以下内容:
const defaultState = {
inputValue:'',
list:[]
}
//reducer可以接收state,但是不能修改state
export default (state = defaultState,action) => {
return state;
}
在组件中就可以使用store的数据
import React,{Component} from 'react';
import store from './store/index';
class TodoList extends Component{
constructor(props){
super(props);
this.state = store.getState();
this.handleStoreChange = this.handleStoreChange.bind(this);
store.subscribe(this.handleStoreChange);
}
handleStoreChange(){
this.setState(store.getState());
}
render(){
return (
<div>
<input type='text' value={this.state.inputValue}/>
<button onClick={this.handleClick}>提交</button>
<ul>
{this.state.list.map((item,index)=>{
return (
<li key={index}>{item}</li>
);
})}
</ul>
</div>
);
}
}
export default TodoList;
TodoList案例
TodoList.js
import React,{Component} from 'react';
import store from './store/index';
import {DELETE_TODO_ITEM,CHANGE_INPUT_VALUE,ADD_TODO_ITEM} from './store/actionType'
class TodoList extends Component{
constructor(props){
super(props);
this.state = store.getState();
this.handleChange = this.handleChange.bind(this);
this.handleStoreChange = this.handleStoreChange.bind(this);
this.handleClick = this.handleClick.bind(this);
store.subscribe(this.handleStoreChange);
}
handleChange(e){
const action = {
type:CHANGE_INPUT_VALUE,
value:e.target.value
}
store.dispatch(action);
}
handleStoreChange(){
this.setState(store.getState());
}
handleClick(){
const action = {
type:ADD_TODO_ITEM
}
store.dispatch(action);
}
handleClickItem(index){
const action = {
type:DELETE_TODO_ITEM,
index:index
}
store.dispatch(action);
}
render(){
return (
<div>
<input type='text' value={this.state.inputValue} onChange={this.handleChange} />
<button onClick={this.handleClick}>提交</button>
<ul>
{this.state.list.map((item,index)=>{
return (
<li key={index} onClick={this.handleClickItem.bind(this,index)}>{item}</li>
);
})}
</ul>
</div>
);
}
}
export default TodoList;
store/index.js
import {createStore} from 'redux';
import reducer from './reducer';
const store = createStore(reducer);
export default store;
store/reducer.js
import {DELETE_TODO_ITEM,CHANGE_INPUT_VALUE,ADD_TODO_ITEM} from './actionType'
const defaultState = {
inputValue:'',
list:[]
}
//reducer可以接收state,但是不能修改state
export default (state = defaultState,action) => {
console.log(state,action);
if(action.type === CHANGE_INPUT_VALUE){
const newState = state;
newState.inputValue = action.value;
return newState;
}
if(action.type === ADD_TODO_ITEM){
const newState = state;
newState.list.push(newState.inputValue);
newState.inputValue = '';
return newState;
}
if(action.type === DELETE_TODO_ITEM){
const newState = state;
newState.list.splice(action.index,1);
return newState;
}
return state;
}
store/actionType.js
export const CHANGE_INPUT_VALUE = 'change_input_value'
export const ADD_TODO_ITEM = 'add_todo_item'
export const DELETE_TODO_ITEM = 'delete_todo_item'
参考文章: https://segmentfault.com/a/1190000011474522
核心API: