zoukankan      html  css  js  c++  java
  • react&redux&hook

    1.理解redux原理

    https://juejin.im/post/5def4831e51d45584b585000#heading-12

    http://www.imooc.com/read/72/article/1679

    redux通过创建一个store仓库保存state,每个action通过创建actioncreator创建,修改state需要通过dispatch相应的action去触发相应的reducer去改变state;

    redux库包含createStore;包含三个参数 reducer、initalState、enhance;创建一个store仓库

    combinreducer 生成一个combine函数并通过闭包将reducer 以各自各state为key;对应的reducer为value的对象;dispatch时会循环遍历该对象,匹配到对应的action_type去改变state,并且根据hasChange是否true判断是否返回更改过的新对象达到immutable

    applymiddlewares  返回一个符合enhance的函数;是通过增强dispatch方法实现插件

    2.react-redux 容器组件链接

    react-redux的provide、connect是利用react context实现的

    参考:https://juejin.im/post/5a90e0545188257a63112977

     每个容器组件通过connect链接,connect函数的mapStateToProps会根据返回的state去添加订阅;只有该容器组件用到的state改变才会触发该组件重新渲染

    https://www.cnblogs.com/geoffgu/p/6035910.html

    //index.js
    import React from "react";
    import ReactDOM from "react-dom";
    import App from "./App";
    import {Provider} from "react-redux";
    
    import { createStore,combineReducers } from "redux";
    let reducerObj
    ={ name (state='',action){ const {type,payload} =action; switch(type){ case 'SET_NAME': return payload; default : } return state; }, age (state='',action){ const {type,payload} =action; switch(type){ case 'SET_AGE': return payload; default : } return state; }, count (state='',action){ const {type,payload} =action; switch(type){ case 'ADD_COUNT': return state+1; case 'SUBCTRACT_COUNT': return state-1; default : } return state; } }; let store=createStore(combineReducers(reducerObj),{ name:'penguin', age:30, count:0 }); //通过provider 注入生成的store仓库 ReactDOM.render( <Provider store={store}> <App/> </Provider> , document.getElementById("root") );
    /* eslint-disable no-console */
    /* eslint-disable no-debugger */
    import React from "react";
    import { connect, useSelector, useDispatch } from "react-redux";
    import { addCount, subtractCount } from "./action";
    
    const Detail=(props)=>{
      const {name,age}=props;
      console.log('渲染了Detail');
      return (
          <div>
              <span>{age}</span>
              <span>{name}</span>
          </div>
      );
    };
    const PDetail=connect(
      function mapStateToProps (state, props) {
        let {name,gender,...rest}=state;
        return {name,gender};
      },
      function mapDispatchToProps (dispatch, props) {
        return { dispatch };
      }
    )(Detail);
    
    
    
    //利用react-redux 7.1新增的useSelector、useDispatch替代connect
    const PCounter=(props)=>{
      const count=useSelector(state=>state.count);
      const dispatch=useDispatch();
      console.log('渲染了counter');
      return(
          <div>
              <span>{count}</span>
              <button onClick={()=>dispatch(addCount())}>+1</button>
              <button onClick={()=>dispatch(subtractCount())}>-1</button>
          </div>
      );
    };
    
    
    // const Counter1=(props)=>{
    //   const {count,dispatch} = props;
    //   console.log('渲染了counter1');
    //   return(
    //       <div>
    //           <span>{count}</span>
    //           <button onClick={()=>dispatch(addCount())}>+1</button>
    //           <button onClick={()=>dispatch(subtractCount())}>-1</button>
    //       </div>
    //   );
    // };
    // const PCounter1=connect(
    //   function mapStateToProps (state, props) {
    //     let {count,...rest}=state;
    //     return {count};
    //   },
    //   function mapDispatchToProps (dispatch, props) {
    //     return { dispatch };
    //   }
    // )(Counter1);
    
    const App=(props)=>{
      return (
          <div>
              <PDetail/>
              <PCounter/>
              {/* <PCounter1/> */}
          </div>
      );
    };
    export default App;

  • 相关阅读:
    iOS越狱系列(一):使用Reveal分析APP
    ios-异步消息同步问题-典型使用场景: 微信私信界面
    ios 消息跳转处理
    iOS开发UI篇—IOS CoreText.framework --- 基本用法
    IOS开发之实现App消息推送(最新)
    Thread 1: signal SIGABRT-内存管理的陋习
    别用symbolicatecrash来解析crash Log了by 风之枫
    通过崩溃trace来查找问题原因 .
    Xcode 6视图调试小贴士
    调试message send to deallocated instance问题
  • 原文地址:https://www.cnblogs.com/little-ab/p/12889463.html
Copyright © 2011-2022 走看看