react(react+dva+antd)知识点提取

react part

1.props属性

props是一个从外部传进组件的参数,主要作为就是从父组件向子组件传递数据,它具有可读性和不变性,只能通过外部组件主动传入新的props来重新渲染子组件,否则子组件的props以及展现形式不会改变。


//父组件
class Farther extends React.Component{
    state = {
        test:'我是父组件'
    };
    render() {
        return (
            <Children test={this.state.test} />
        )
    }
}

//子组件
class Children extends React.Component {
    render() {
        //通过props获取
        const {test} = this.props
        return (
            <div>{test}</div>
        )
    }
}

2.state属性

state顾名思义就是状态,它只是用来控制这个组件本身自己的状态,我们可以用state来完成对行为的控制、数据的更新、界面的渲染.

setState更新是异步的,事件处理过程 setState 不会同步更新 this.state, React 控制之外的情况, setState 会同步更新 this.state

总结:尽量少地用 state,尽量多地用 props。原因是这样会降低代码维护的难度,也会在一定程度上增强组件的可复用性,react鼓励我们编写函数式组件。

3.生命周期

  • componentDidMount

在组件已经完全挂载到网页上才会调用被执行,保证数据的加载。用来加载外部数据用的,或处理其他的副作用代码, 在这方法中调用setState方法,会触发重渲染

注:做项目的时候发现,当父组件传参子组件时,子组件的componentDidMount通过this.props拿不到参数,原因是获取服务器参数的函数是异步调用的,在组件初始化的时候获取到的是初始值,当异步函数执行后,值发生改变,此时将参数传递给子组件,所以在组件挂载之后执行的函数,在render里可以获取得到。
这里修正一下说法:react不允许在componentDidMount中setState,原因是在组件挂载之后更新状态将触发第二个render()调用,并可能导致属性/布局抖动。(原文:Updating the state after a component mount will trigger a second render() call and can lead to property/layout thrashing.

  • componentDidUpdate

这个生命周期用于组件更新结束之后执行,在初始化render时不执行。
用处:当我需要父传子的时候某个参数,在进入页面的时候判断是否弹窗时,由于使用componentDidMount拿不到this.props.data,使用componentWillReceiveProps则会我一改变state时这个方法就调用一次,所以用到了componentDidUpdate

   componentDidUpdate(prevProps, prevState) {
       <!--一定要给个判断条件,不然就会死循环-->
       if (prevProps.data !== this.props.data) {
         const { data } = this.props;
         if (data) {
           this.setState({
             data
           });
         }
       }
   }

总结:我们知道,react函数每次更新组件(或者数据)都需要this.setState(state)来进行,这里补充每次调用setState()结束之后都会自动调用componentDidUpdate()钩子,因此,如果有每次更新都要进行的行动都可以写在这个钩子中。

  • render
我们经常会看到render执行很多次,通常render渲染有以下情况:
1. 首次加载,即数据进来首先执行render渲染基本页面组件
2. setState改变组件内部state。(只要触发setState一次就会render一次)
3. 接受到新的props

注:一般情况下我们会有三次render,首次加载、componentDidMount发送ajax时render、得到回应render

以上是我项目中用到的生命周期,具体生命周期可以看 https://www.cnblogs.com/qiaojie/p/6135180.html

4.事件绑定

(1) 在构造函数中使用bind绑定this

class Button extends React.Component {
   constructor(props) {
       super(props);
       this.handleClick = this.handleClick.bind(this);
     }
     handleClick(){
       console.log('this is:', this);
     }
     render() {
       return (
         <button onClick={this.handleClick}>
           Click me
         </button>
       );
     }
   }

(2) 在调用的时候使用bind绑定this

class Button extends React.Component {
  handleClick(){
    console.log('我是点击');
  }
  render() {
    return (
      <button onClick={this.handleClick.bind(this)}>
        Click me
      </button>
    );
  }
}

(3) 在调用的时候使用箭头函数绑定this

class Button extends React.Component {
  handleClick(){
    console.log('我是点击');
  }
  render() {
    return (
      <button onClick={()=>this.handleClick()}>
        Click me
      </button>
    );
  }
}

(4) 使用属性初始化器语法绑定this(实验性)

class Button extends React.Component {
  handleClick=()=>{
    console.log('我是点击');
  }
  render() {
    return (
      <button onClick={this.handleClick}>
        Click me
      </button>
    );
  }
}

总结:方式1是官方推荐的绑定方式,也是性能最好的方式。方式2和方式3会有性能影响并且当方法作为属性传递给子组件的时候会引起重渲问题。方式4目前属于实验性语法,但是是最好的绑定方式,需要结合bable转译。我比较习惯用方法4

dva part

官网说法:dva 首先是一个基于 redux 和 redux-saga 的数据流方案,然后为了简化开发体验,dva 还额外内置了 react-router 和 fetch,所以也可以理解为一个轻量级的应用框架。
dva由以下部分组成:

1.定义 Model
import { concernDelete } from '@/services/api';

export default {
  namespace: 'list', //命名空间, 表示在全局 state 上的 key
  state: {
    data: [],
  },
//这块是redux-saga框架的属性
  effects: {
    *remove({ payload }, { call, put }) {
       //concernDelete接口api
      const response = yield call(concernDelete, payload)
      // put函数是用来发送action的
      yield put({
        type: 'delete',
        payload: payload,
      });
    },
  },

//reducers 等同于 redux 里的 reducer,接收 action,同步更新 state
  reducers: {
    // 不符合redux理念,有空要改过来
    delete(state, { payload }) {
      const idx = state.concerns.findIndex(item => item.id == payload.id);
      state.concerns.splice(idx, 1);
      return state;
    },
  },
};

注:

effect:
相当于redux框架中的dispatch函数,当put一个action后,reducer中就会计算新的state并返回,注意: put 也是阻塞 effect。

call(fn, ...args):
相当于可以调用其他函数的函数,它命令 middleware 来调用fn 函数, args为函数的参数,注意: fn 函数可以是一个 Generator 函数,也可以是一个返回 Promise 的普通函数,call 函数也是阻塞 effect。

2.编写 UI Component
  const columns = [
     {
       title: '姓名',
       dataIndex: 'title',
       render: (...text) => <List.Item>{text[1].name}</List.Item>,
     },
     {
       title: '管理',
       dataIndex: 'manage',
       render: (...text) => {
         const editAndDelete = (key, rowKey) => {
           if (key === 'edit') this.showEditModal(rowKey);
           else if (key === 'delete') {
             Modal.confirm({
               title: '删除关心的人',
               content: '确定删除关心的人吗?',
               okText: '确认',
               cancelText: '取消',
               onOk: () => this.deleteItem(text[1].id, text[1].isMainPerson),
             });
           }
         };
         return (
           <List.Item
             actions={[
               <a
                 data-key="edit"
                 onClick={e => {
                   e.preventDefault();
                   this.showEditModal(text[1], { edit: 'edit' });
                 }}
               >
                 编辑
               </a>,
               <a
                 data-key="delete"
                 onClick={e => {
                   e.preventDefault();
                   const {
                     parentNode: {
                       parentNode: {
                         parentNode: {
                           parentNode: {
                             parentNode: {
                               dataset: { rowKey },
                             },
                           },
                         },
                       },
                     },
                   } = e.target;
                   editAndDelete(e.target.dataset.key, rowKey);
                 }}
               >
                 删除
               </a>,
             ]}
           />
         );
       },
     },
   ];

3.connect 起来
@connect(({ list, loading }) => ({
  list,
  loading: loading.models.list,
}))

class BasicList extends PureComponent {
  state = {
    selectedRows: [],
  };
  componentDidMount() {
    const { dispatch } = this.props;
    dispatch({
      type: 'list/fetch',
      payload: { isDeleted: 0 },
      //如果model层effects有传入callback传参,并将response回调的话,这里就可以拿到callbak
      // callback(res){
      //   console.log(res)
      // }
    });
  }
4.修改antd的样式

通过:global可以修改到antd的样式,如代码:

   :global(.ant-form-item) {
        min-width: 545px;
        display: flex;

        :global(.ant-form-item-control-wrapper) {
          margin-left: 60px;
          width: 408px;

          input {
            height: 36px;
            line-height: 36px;
          }

        }

        :global(.ant-form-item-label) {
          label {
            font-size: 14px;
            color: #808184;
          }

        }
}

未完待续..

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容

  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 8,365评论 1 33
  • 40、React 什么是React?React 是一个用于构建用户界面的框架(采用的是MVC模式):集中处理VIE...
    萌妹撒阅读 976评论 0 1
  • 说在前面 关于 react 的总结过去半年就一直碎碎念着要搞起来,各(wo)种(tai)原(lan)因(le)。心...
    陈嘻嘻啊阅读 6,800评论 7 41
  • 生命周期流程图简单如下: 组件让你把用户界面分成独立的,可重复使用的部分,并且将每个部分分开考虑。React.Co...
    Simple_Learn阅读 1,036评论 0 0
  • 这是一部从编剧到表演都很燃的一部剧。我在想为什么电影的名字叫《战狼》,不叫《战虎》或者《战豹》呢。 我最近看了三本...
    宜爱阅读 542评论 2 6