react-redux 学习

182 阅读4分钟

react-redux 学习

网上很多react-redux的教程,但是看了很多也没领悟怎么入门,于是记录下自己的入门
过程,写的都是最基础的东西,希望对不知道如何入门的redux小白有帮助。s

action ()用户行为

Action 是把数据从应用(译者注:这里之所以不叫 view 是因为这些数据有可能是服务器响应,用户输入或其它非 view 的数据 )传到 store 的有效载荷。它是 store 数据的唯一来源。一般来说你会通过 store.dispatch() 将 action 传到 store。

Action 本质上是 JavaScript 普通对象。我们约定,action 内必须使用一个字符串类型的 type 字段来表示将要执行的动作。多数情况下,type 会被定义成字符串常量。当应用规模越来越大时,建议使用单独的模块或文件来存放 action。

const ADD_TODO = 'ADD_TODO'
{
  type: ADD_TODO,
  text: 'Build my first Redux app'
}

action我喜欢叫做用户行为, 主要以对象形式存在, 用于通知store用户要发起什么行为。简单来讲的话就像ajax中的method: get,在发送请求前 说明自己的操作行为。 type 属性定义行为,剩下的属性自己定义,主要以参数的形式进入reducer函数。 写法很简单, 只要有个type就好了。(记住行为用大写描述,react的规范之一,也可以不遵守)

    const user = {
        type: 'CHANGE_NAME',
        info: {
            name: '哈哈',
            age: '18',
            sex: '未定义'
        }
    }

dispatch(action) 发送请求

分发 action。这是触发 state 变化的惟一途径。

将使用当前 getState() 的结果和传入的 action 以同步方式的调用 store 的 reduce 函数。它的返回值会被作为下一个 state。从现在开始,这就成为了 getState() 的返回值,同时变化监听器(change listener)会被触发。

这个就是store对象底下的一个方法,参数为上面定义的action对象,主要用于触发监听器。

reducer

Reducers 指定了应用状态的变化如何响应 actions 并发送到 store 的,记住 actions 只是描述了有事情发生了这一事实,并没有描述应用如何更新 state。

这个是最重要的一个东西,他给我的感觉就是一个接收器,处理器。他会接受两个值,一个是state, 一个是action。 action就不用说了,state这个就是很重要的一个东西。它不像vuex一样state是定义在一个对象下的, 当然你可以写一个state文件管理所有的state,所有reducer接受的state会挂载在store的一个对象下,这样当你页面访问state对象下,能拿到的就是在reducer函数中state参数,记住redux不直接修改 state 中的字段,而是返回新对象

    const initState  = {
        name: '张三'
    }
    
    const changeName (state=initState, action) {
        switch(action.type) {
            case 'CHANGE_NAME':
                return action.name
                break;
                
            default: 
                return state
                break;
        }
    }

store

Store 就是把它们联系到一起的对象。Store 有以下职责:

维持应用的 state; 提供 getState() 方法获取 state; 提供 dispatch(action) 方法更新 state; 通过 subscribe(listener) 注册监听器; 通过 subscribe(listener) 返回的函数注销监听器。

我用到的有2个方法dispatch,createStore ,createStore就是创建一个store对象,这个对象会监听你的state对象并对视图做更新


demo1

因为只是做测试用, 所以没有分文件处理,项目中不要使用一个文件管理
所有对象,请按照官方用多文件进行单独管理

reduxStore.js

import { createStore } from 'redux'
import { combineReducers } from 'redux'



//创建action
const add_name = (val) => {
	return {
		type: 'add',
		name: '增加'
	}
}


//创建reducer

const initState = 'null';



//表示某个页面的功能   里面包括  操作,初始化状态 , 操作后的返回对象。
const changeName = (state = initState, action)=>{

	console.log(action, 'action')

	switch (action.type) {
        case 'add':
            return action.name //新的state
        default:
         return state   
    }
}

const changeName2 = (state = { name: 'hello' }, action)=>{

	console.log(action, 'action')

	switch (action.type) {
        case 'add':
            return '' //新的state
        default:
         return state   
    }
}


// 整个store对象
const rootReducer = combineReducers({
    changeName,
    changeName2
})



const store = createStore(rootReducer);


export default store;

index.js 入口文件

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import SideNav from './components/SideNav';
import router from './router/index'
//import registerServiceWorker from './registerServiceWorker';
import { HashRouter, Route, Link, Switch } from 'react-router-dom';

//store文件引入
import { Provider } from 'react-redux';
import store from './store/reduxStore';




ReactDOM.render( 
   <div id="page">
        //Provider组件可以将store对象挂载在react上,子孙组件都能共享到
   		<Provider store={store}>
			<App/>
		</Provider>
	</div>
	,
	document.getElementById('root')
);
//registerServiceWorker();

redux.js redux测试组件

import React from 'react'
import {connect} from 'react-redux';

class Reduxs extends React.Component {
	constructor(props) {
		super(props);
	}

	handleName() {
		console.log(this, 'click')

		this.props.dispatch({
			type: 'add',
			name: '张三'
		})

		console.log(this.props.myName, 'this.props.myName')
	}


	render() {

		//let store = this.getChildContext();

		//console.log(this, 'store')

		console.log(this.props)
		return (
			<div>
				<h2>redux</h2>

				<p>
					名字: {this.props.myName}

					
					
				</p>
				<p>
					<button onClick={this.handleName.bind(this)}>改变</button>
				</p>
			</div>
		)
	}
}

const mapStateToProps  = (store) => {
	//在这里能拿到rootReducer对象
	console.log(store, '123')
	console.log(store.getState, '1234')

 	return {
 		myName: store.changeName,
 	}
}



//connect可以将元素传递到组件中
Reduxs = connect(mapStateToProps)(Reduxs)

export default Reduxs

这个是个非常简单的demo, 这样可以让你对redux的使用了解一些, 后续的一些复杂使用下次更新。

因为某些网站对md文件不兼容, 可以去本人GitHub文档中心查看

本人GitHub文档地址