Redux三部曲之曲一《还阔以》

背景

我:您好!我对此职位感兴趣,能够聊聊吗?
雇用者:您好!谢谢关注。轻易发一份您的简历吗?

   几分钟后。。。  

雇用者:请过用过react吗?
我:只看过一些项目,没有实战开发过。

雇用者至今石沉大海,再背面跟雇用者谈天基本上都问是不是用过react

卧薪尝胆

近来在进修react,记得刚从vue的战场上厮杀返来,就发明已跟时期脱轨了。不过幸亏,两个框架头脑差异不是很大,看起来也没有那末的费劲,之前花了一些时刻进修了react的语法以及一些简朴运用。想进修下react百口桶中的redux,恰好看到了阮一峰先生的redux入门文章,受益不浅。因而跟人人一同分享下进修的心得,这个是阮一峰先生的原文文章

关于Redux

大佬的文章中诠释了rudex什么时刻须要不需取用.然则,由于,我是进修,纵然晓得本身如今现在用不上,然则照样要去搞,要不然须要的时刻就书到用时方恨少了[hahaha]。因而,这里我就不跟人人说reudx这个人人伙什么时刻要用了,感兴趣的骨子们能够移步大佬文章哈。
redux是一种设想形式(一种卓有成效的处置惩罚方案,一种处置惩罚问题的模板)。它是用来治理状况的,就像数据库,用来治理数据,数据举行能够对一系列的操纵。我们一切须要同享的状况都能够用过redux来举行操纵。官方的诠释是:‘是javascript容器,供应可展望化的状况治理。能够让你构建一致化的运用,运用于差别的环境,而且易于测试’

进入rudex

先构建一个react项目,直接上手,边学边做,这里是经由过程一个简朴计数器的运用让人人感受到rudex在项目上怎样去运用

create-react-app redux-counter

再引入redux

yarn add redux

把准备工作做完了今后,我们就要想了,之前我们说过我们要把一切状况都放在rudex内里,然则怎样做呢。Redux给我们供应了一个store来存储状况,全部运用store是唯一的
Store有以下用法:

  • 供应运用须要的state,是一个容器
  • 供应getState()要领猎取state
  • 供应dispatch(action)要领猎取state;
  • 供应subscribe(listener)注册监听器

如今我们先能够先没必要对这些东西有很清晰的相识,只须要晓得有这些东西就能够,由于’贫困会限定我们的设想’。假如我们晓得了有,背面有难题就晓得彷佛有东西能够处置惩罚。假如我们什么都不晓得,那末代码写起来就会一筹莫展,就算百度都不晓得怎样去表达我们想要的答案。那末听我娓娓道来。
在我们适才构建的src目录下的index.js文件下修正下代码

//增添的代码
import { createStore } from 'redux';
import counter from './reducers';
const store = createStore(counter);
//修正的代码
ReactDOM.render((<div>
  { store.getState() }
</div>), document.getElementById('root'));

createStore是redux供应供应的函数用来天生store,它吸收对store举行处置惩罚的reducer作为参数,reducer我们先不说,稍后再讲。
我们如今用counter替代下,counter如今就是处置惩罚这个计数器的函数,待会儿我们会在src下建一个reducers文件夹内里会暴露出counter这个函数。我们在render中让view层显现猎取到state经由过程 store.getState()
那末我们在src下新建一个reducers文件夹,内里新建一个index.js文件,代码以下:

export default (state = 0, action) => {
    console.log(action.type)
    switch(action.type) {
      case 'INCREMENT': 
        return state + 1;
      case 'DECREMENT':
        return state - 1;
      default:
        return state; 
    }
  }

这里供应状况,供应能够被action盘算的状况,视图与状况一一对应。
Redux初次实行时,state为undefined,此时我们能够借机设置并返回运用初始的state,因而这里我们用state=0 来初始化状况,在这里我们初始化状况直接在函数参数中经由过程(state=0),这是不好的做法,背面我们会把初始状况定义给一个常量,这里我们就先如许写。
然后经由过程action来转变状况,当我们在推断action的时刻每每用switch举行操纵。但我们用户要操纵数据的时刻,就会触发action。
到这里运转下项目,我们便能够看到界面上涌现了一个’0′.
接着往下,我们再来写一个用户操纵的组件Counter,在components下新建一个Counter.js

import React,{ Component } from 'react';

class Counter extends Component {
  render () {
      const { value,onIncrement,onDecrement } = this.props;
      return (
          <div>
              Clicked: { value } times
              <button onClick={ onIncrement }>{ '+'}</button>{ ' '}
              <button onClick={ onDecrement }>{'-'}</button>
          </div>
      )
  }
}

export default Counter;

我们想完成能加能减。待会儿我们就须要在父组件中把两个要领以及state通报过来。
src下的index文件更改成以下:

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import { createStore }   from 'redux';
import Counter from './components/Counter'
import counter from './reducers';

const store = createStore(counter);
const rootEl = document.getElementById('root')
const render = () => {
    ReactDOM.render(<Counter value={store.getState()} onIncrement={() => store.dispatch({
        type: "INCREMENT"
    })}
    onDecrement={() => store.dispatch({
        type: 'DECREMENT'
    })}
    />,rootEl)
}
render();
store.subscribe(render)

serviceWorker.unregister();
//零丁构建状况树,状况是跟UI一致的

在这里我们又两个生疏的api。dispatch和subscribe.
dispatch,寓意为调派。假如我们state内里的状况要转变,我们就必须要经由过程store.dispatch要领。这是View发出Action的唯一要领。没有礼貌就不成方圆,这个状况是人人同享的,因而任何组件想要转变它,这都是唯一门路.它吸收一个action。假如须要详解相识dispatch怎样经由过程action触发reducer,能够看下源码。

store.subscribe(),在这里,store许可我们设置一个监听函数,作甚监听,就是state转变了,我view要做出转变,这才是MVVM。在React中,我们就监听render要领,只需state转变了,render就帮你把页面从新衬着。别的store.subscribe()要领会返回一个函数,我们假如要消除监听,就能够挪用这个函数。做法以下:

let unsubscribe = store.subscribe(() => {
  console.log(store.getState())
})
unsubscribe;

到这里我们就已完成了一个redux的小运用

总结

redux实在就三大观点。reducer、action、store
我们先说action,action实在最简朴了,就是一个集合便签,用来治理actionsTypes,store.dispath的时刻就通知action你要干吗。
接下来就是reducer了,经由过程actio获得的操纵,reducer就来实行响应的操纵,并把终究的数据再给store。那末store,很显然,他把action和reducer联系起来了,而且他还供应要领给我们操纵数据,给视图供应数据
这里有此次实践的源码,有须要的能够采之
未完待续…
*
小生才疏学浅,大三学徒一枚。文章中定有很多不严谨的地方或是不正确的明白,还望大佬们不吝珠玉。同时也愿望大佬能分享一些本身关于这一块以为不错的干货链接。

    原文作者:想象你的身影
    原文地址: https://segmentfault.com/a/1190000017486726
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞