• react-10 react-redux


    React和Redux事实上是两个独立的产品,可以使用React而不使用Redux,也可以使用Redux而不使用React,而一个名叫react-redux的库是将react和redux结合的一个库; 通过对redux api的封装形成基于react的组件,操作更佳简洁

    原理

    mark

    安装

    npm install redux -D
    npm install react-redux -D
    

    核心API

    • Provider----提供包含store的上下文,将store传递给内部组件,内部组件可以享有这个store,并可以对其state进

      行更新。

    • connect ----连接容器组件与UI组件

    react-redux将所有组件分成两大类

    1. UI组件

    1) 只负责 UI 的呈现,不带有任何业务逻辑
    
    2) 通过props接收数据(一般数据和函数)
    
    3) 不使用任何 Redux 的 API
    
    4) 一般保存在components文件夹下
    

    2. 容器组件

    ​ 1) 负责管理数据和业务逻辑,不负责UI的呈现

    ​ 2) 使用 Redux 的 API

    ​ 3) 一般保存在containers文件夹下

    核心API

    1. Provider:

    让所有组件都可以得到state数据

    mark

    2. connect

    用于包装 UI 组件生成容器组件

    mark

    3. mapStateToprops:

    将外部的数据(即state对象)转换为UI组件的标签属性

    mark

    注:

    • 形参是state(就是store的state)

    • 这里返回的应该是一个对象,因为要挂在props上。

    4. mapDispatchToProps

    将分发action的函数转换为UI组件的标签属性

    就是将操作状态的方法挂在了子组件的props上。

    看下面例子:

    function mapDisPatchToProps(dispatch) {
      return {
        addProject: (value, id) => {
          let proItem = {
            id,
            name: value,
            isComplete: false
          };
          dispatch(add_project(proItem));    //注:在这个位置分发 dispatch(action)
        },
        delProject: id => {
          dispatch(del_project(id));
        }
      };
    }
    

    注:

    • 参数为dispatch
    • 返回的是一个个操作状态的方法

    思考:为什么容器组件向UI组件传值,还要使用个回调函数呢?

    很简单,因为react-redux规定的这种语法,没办法使用传统的父向子传值的形式。

    传统的

    
    .....
    render(){
       return(
       <div>
         	  <Son  name="lily"> </Son>
        </div>
       )
    }
    .....
    
    

    但是使用connect封装后,发现找不到书写的位置。所以人家规定了用回调函数的形式传。

    实战练习

    一个面试题:

    mark

    源码:

    https://github.com/wind-zhou/-CMS-

    思考:

    (1)上面项目可不可以不使用redux?

    当然可以!使用redux与否其实就是state由谁管理的问题,大幸的项目使用redux会比较方便,像这种小案例根本没有使用redux的必要,面试时只会增加编程难度。如果仅使用react无非就是自己管理状态而已。会更简单。

    下面是一个react版本的答案:

    import React, { Component } from "react";
    
    let proId = 0;
    let isHideActive = false;
    class ReactCms extends Component {
     constructor(props) {
       super(props);
       this.state = {
         project: []
       };
     }
    
     //   增加
     addProject = () => {
       proId++;
       var newproject = [
         ...this.state.project,
         { name: this.input.value, id: proId, isComplete: false }
       ];
       this.setState({
         project: newproject,
       //   [proId]: "block"
       });
     };
     //   删除
     delProject = id => {
       return () => {
         let newPoject = this.state.project.filter(value => {
           return value.id !== id;
         });
         console.log(newPoject);
    
         this.setState({
           project: newPoject
         });
       };
     };
    
     //   checkbox 激活
     isCheckboxActive = id => {
       return e => {
         //   (1)找到该数据
         let targetProject = this.state.project.filter(value => {
           return value.id == id;
         });
         //   (2)把他的iscpmplete值为true
         targetProject[0].isComplete = !targetProject[0].isComplete;
    
         console.log(targetProject[0]);
         if (targetProject[0].isComplete == true) {
           e.target.parentNode.style.color = "#0f0";
         } else {
           e.target.parentNode.style.color = "#f00";
         }
       };
     };
    
     //   隐藏已完成
     hide = () => {
       isHideActive = !isHideActive;
       let idList = [];
       //   (1)找到所有已完成的项
       let didItems = this.state.project.filter(value => {
         return value.isComplete == true;
       });
       console.log(didItems);
    
       //   (2)拿到所有项的id
    
       didItems.map(value => {
         idList.push(value.id);
       });
       console.log(idList);
       // (3)将每个id在state里存一个状态
       idList.map(item => {
         if (isHideActive == true) {
           this.setState({
             [item]: "none"
           });
         } else {
           this.setState({
             [item]: "block"
           });
         }
       });
     };
    
     clear = () => {
       let idList = [];
       //   (1)找到已完成的项
       let didItems = this.state.project.filter(value => {
         return value.isComplete == true;
       });
    
       //   (2)删除已完成的数据
       didItems.map(value => {
         idList.push(value.id);
       });
    
       let newproject = this.state.project.filter(value => {
         return !idList.includes(value.id);
       });
       this.setState({
         project: newproject
       });
     };
    
     render() {
       console.log(this);
       let con = this.state.project.map(value => {
         return (
           <li
             key={value.id}
             style={{ color: "#f00", display: this.state[value.id] }}
           >
             <input type="checkbox" onClick={this.isCheckboxActive(value.id)} />
             {value.name}
             <button onClick={this.delProject(value.id)}>-</button>
           </li>
         );
       });
       return (
         <ul>
           <li>
             <input
               type="text"
               ref={ele => {
                 this.input = ele;
               }}
             />
             <button onClick={this.addProject}>增加</button>
           </li>
           {con}
           <button onClick={this.hide}>隐藏已完成</button>
           <button onClick={this.clear}> 清空已完成</button>
         </ul>
       );
     }
    }
    
    export default ReactCms;
    
    
    生活是一首长长的歌!
  • 相关阅读:
    关于闭包和作用域的问题
    中文字体@font-face的导入
    一个跑马灯插件(持续优化)
    关于JS的clone()函数编写的一些问题
    函数的自执行,变量提升和函数提升
    Android 之Map容器替换 SparseArray,ArrayMap,ArraySet
    Anndroid GC 那些事
    Spark Streaming实时计算
    REDIS基础要点
    zookeeper要点总结
  • 原文地址:https://www.cnblogs.com/wind-zhou/p/14806358.html
Copyright © 2020-2023  润新知