• React笔记


    一、生命周期

    二、Redux

     createStore 创建一个store

    store.dispatch 派发action  将action传递给store

    store.getState 获取到state里的数据内容

    store.subscribe 订阅store 只要store里的数据改变  subscribe 回调的函数就会被执行

    三、什么是Redux中间件

    Redux的标准流程: 

    view在action中会派发一个action;

    action通过store的dispatch方法派发给store;

    store接收到action,连同之前的state派发给Reducer;

    Reducer返回一个新的数据给store ,state更新数据

    Redux的中间件里的中间指的是action和store之间

    action只可以传对象,有了Redux-thunk,就可以传函数了

    四、redux-thunk的使用

    https://github.com/zalmoxisus/redux-devtools-extension

    第一步在store的index.js里配置下面的代码

    import { createStore, applyMiddleware, compose  } from "redux";
    import reducer from "./reducer";
    import thunk from "redux-thunk";
    
    const composeEnhancers =
      typeof window === 'object' &&
      window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ?
        window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({
          // Specify extension’s options like name, actionsBlacklist, actionsCreators, serialize...
        }) : compose;
    
    // thunk是redux的中间件
    const enhancer = composeEnhancers(
      applyMiddleware(thunk)
      // other store enhancers if any
    );
    
    const store = createStore(reducer, enhancer)
    
    export default store

    第二步,在actionCreators.js里写action,可以是对象,也可以是函数

    export const getTododList = () => {
      return () => {
        axios.get('/list.json').then((res) => {
          const data = res.data
          console.log(data)
        })
      }
    }

    第三步、在业务组件里的生命周期中调用,返回的值使用store.dispatch()派发到store中

    // 挂载完成,类似vue的mounted
      componentDidMount() {
        const action = getTododList()
        store.dispatch(action)
      }

    五、redux-saga的使用

    第一步、在store的index文件中配置redux-saga

    import { createStore, compose, applyMiddleware } from "redux";
    import reducer from "./reducer";
    import createSagaMiddleware from 'redux-saga'
    import TodoSagas from './sagas'
    
    // create the saga middleware
    const sagaMiddleware = createSagaMiddleware()
    
    const composeEnhancers =
      typeof window === 'object' &&
      window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ?
        window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({
          // Specify extension’s options like name, actionsBlacklist, actionsCreators, serialize...
        }) : compose;
    
    const enhancer = composeEnhancers(applyMiddleware(sagaMiddleware));
    
    const store = createStore(reducer, enhancer)
    
    // 具体执行方法在TodoSagas文件中
    sagaMiddleware.run(TodoSagas);
    
    export default store

    第二步、创建具体处理的文件sagas

    import { takeEvery, put } from 'redux-saga/effects'
    import { GET_INIT_LIST } from "./actionTypes"
    import axios from 'axios'
    import {initListAction} from "./actionCreators";

    function* getInitList() {
    try {
    const res = yield axios.get('/list.json');
    const action = initListAction(res.data);
    yield put(action)
    } catch (e) {
    console.log('list.json网络请求失败')
    }
    }

    // generator函数
    // redux-saga监控到type为GET_INIT_LIST的action时,执行getInitList方法
    function* mySaga() {
    yield takeEvery(GET_INIT_LIST, getInitList);
    }

    export default mySaga;

    第三步、在业务组件里的生命周期中调用,返回的值使用store.dispatch()派发到store中

    componentDidMount() {
        const action = getInitList()
        store.dispatch(action)
      }

    备注:redux-thunk把处理接口的方法写在reducer中,redux-saga把方法写在自定义的文件中(上面是写在sagas中)

    六、异步组件

    在react中使用异步组件

    先下载  react-loadable  https://github.com/jamiebuilds/react-loadable

     在需要异步引入的组件文件夹里,新建loadable.js(自定义名字)文件:

    loadable.js

    import React from 'react';
    import Loadable from 'react-loadable';
    const LoadableComponent = Loadable({
      loader: () => import('./index'),
      loading() {
        return <div>正在加载</div>
      }
    });
    
    export default class App extends React.Component {
      render() {
        return <LoadableComponent/>;
      }
    }

    引入组件的地方,我这里是App.js

    import Detail from "./pages/detail/loadable";
  • 相关阅读:
    NOI2015 小园丁和老司机
    退役记
    留言板
    $mathfrak {reputation}$
    计算几何基础
    HNOI2018简要题解
    JXOI2018简要题解
    BJOI2018简要题解
    HAOI2018 简要题解
    CQOI2018简要题解
  • 原文地址:https://www.cnblogs.com/zhaobao1830/p/13878942.html
Copyright © 2020-2023  润新知