react之react&react-redux

192 阅读3分钟

今日学习内容

1.redux

2.react-redux

1.redux

1.下载redux:npm install --save redux

2.在src下创建store文件夹,在文件夹内创建index.js文件,写入:

//1.引入redux
import {createStore} from 'redux'
import reducer from './reducer'
//2.创建store对象
let store = createStore(reducer)
//3.暴露
export default store

3.在store文件夹或者components文件夹内创建(两个都行,看个人习惯)组件对应的请求数据js文件, testReducer.js

import {TEXT_CHANGE} from '../store/actionsName'

let obj = {             //创建模拟数据
    name:"leiyuhang",
    age:23
}

let testReducer=(state=obj,action)=>{
    switch(action.type){
        case TEXT_CHANGE:
            return {...state,name:state.name="mayun"+action.num}
        default:
            return state    
    }
}

export default testReducer

4.将每个组件对应的数据请求文件合并到一起, reducer.js

import testReducer from '../components/testReducer'//将文件引入进来

import {combineReducers} from 'redux'   //引入redux中合并的方法combineReducers

let reducer = combineReducers({
    testReducer
})

export default reducer

5.将请求事件名封装到一个自定义文件内, actionsType.js

import {TEXT_CHANGE} from './actionsName'
export let ADD = (num)=>{
    //return {type:"CHANGE",num}  直接将事件名写到这
    return {type:TEXT_CHANGE,num}
}

6.将请求的事件名封装到一个js文件内,actionsName.js(或者直接省去这一步,直接将事件名写到第5步的type后)

export let TEXT_CHANGE = 'CHANGE'

7.创建jsx文件请求redux数据

import React, { Component } from 'react'
import store from '../store/index'      //引入index文件
import {ADD} from '../store/actionsType'    //将封装请求的事件名文件引进来

export default class text extends Component {
    constructor(props){
        super(props)
        this.state={
            text:store.getState().testReducer.name  //获取store中请求的数据,使用getState(),假如将每个请求的数据都写到单独的文件内,获取数据就需要在getState()后写上".xxxxx"
        }
    }
    componentDidMount(){
        store.subscribe(()=>{       //监听器:每当请求的数据改变时,该方法就会修改this.state中的数据,页面重新渲染
            this.setState({
                text:store.getState().testReducer.name
            })
        })
    }
    change=()=>{        //通过事件调用函数的方式请求数据,使用dispatch方法
        store.dispatch(ADD(66)) //一般修改事件名写成大写
    }
    render() {
        return (
            <div>
                <h1>{this.state.text}</h1>
                <button onClick={this.change}>点击修改name</button>
            </div>
        )
    }
}

2.react-redux

一个react的插件,专门用来简化react应用中使用redux

为什么使用react-redux?

because之前的写法redux与react的耦合度过于高。代码不够简洁(组件中出现了大量的store对象)

如何使用react-redux?

1.下载:npm install --save react-redux

2.使用:

①:在index.js中引用react-redux,并使用其中的Provider这个方法,以标签的方法包裹所有子组件

import {BrowserRouter} from 'react-router-dom';
import store from './store/store'
import {Provider} from 'react-redux'
ReactDOM.render(

  <BrowserRouter>
    <Provider store={store}>    //包裹开始,在全局分发store
        <App />
    </Provider>                 //包裹结束
  </BrowserRouter>

  ,
  document.getElementById('root')
);

②:在需要接收数据的页面引入react-redux中connect这个高阶组件的方法

import React, { Component } from 'react'
// import store from '../store/store'
import {connect} from 'react-redux' //引入react-redux中connect这个高阶组件的方法

class faxian extends Component {
    constructor(props){
        super(props)
        this.state={
            text:this.props.state.testReducer.name  //在页面使用this.props.state.xxx.xxx
        }
    }
    render() {
        return (
            <div>
                发现
                {this.state.text}
            </div>
        )
    }
}
//在connect高阶组件中把state当成一个形参传进来,用来接收store中的数据

③:如何用react-redux修改数据

import React, { Component } from 'react'
// import store from '../store/store'
import {connect} from 'react-redux' //引入react-redux中connect这个高阶组件的方法
import {CHANGE} from '../store/actionType'
class faxian extends Component {
    constructor(props){
        super(props)
        this.state={
            text:this.props.state.testReducer.age  //在页面使用this.props.state.xxx.xxx
        }
    }
    fun=()=>{
        //使用this.props.dispatch方法就可以直接修改数据,不用setState方法去修改数据,
        //因为在connect高阶组件中react已经封装好所有操作
        //比如说:this.props哪里来的呢?就是connect高阶组件中已经封装好了的,我们直接使用就行了
        
        this.props.dispatch(CHANGE(3))
    }
    render() {
        return (
            <div>
                发现
                {this.props.state.testReducer.age}
                //通过触发事件调用函数修改参数
                <button onClick={this.fun}>点击修改数据</button>
            </div>
        )
    }
}
//在connect高阶组件中把state当成一个形参传进来,用来接收store中的数据
export default connect(state=>({state}))(faxian)