React + Redux学习总结

1. React

React是一个View层的库,可用于组件化开发。该库提供一个JSX语法,允许用户在JS文件像写HTML一样,编写组件的结构,并根据一系列的语法,将数据嵌入所写的HTML中。

  1. 基本用法
    React框架对用户提供了两个类库,react和react-dom,在使用前需要引入这两个包。其中react提供Component,自定义组件继承Component;react-dom则对外提供了render方法,将组件挂载到页面中。
class App extends React.Component {
  render() {
    return (
      <div>Hello React</div>
    )
  }
}
ReactDOM.render(
  <App />,
  document.getElementById('root')
);
  1. 内部状态state和外部参数prop
    state: 组件内部状态,在constructor构造函数中通过设置this.state的值初始化,此后利用this.state进行获取,并利用this.setState函数更新值(注意:每次都需要返回一个新的对象或者值
    prop: 父组件在调用子组件通过设置属性将数据参入子组件内部,在子组件中通过this.props获取

以上两种数据改变都会触发组件的更新操作。

  1. 事件
    通过在JSX中的标签上设置onClick,onChange等属性,将触发后的事件处理函数作为值。
class App extends React.Component {
  render() {
    return (
      <div>
        <button onClick={add}>增加</button>
      </div>
    )
  }
}

通常情况下,事件处理函数执行后,都会改变现有的state,触发组件更新操作。
注意:事件处理函数异步调用时是在全局环境中执行,因此需要绑定this,方法如下

1. 箭头函数: () => {}
2. 在constructor中绑定: this.add = this.add.bind(this)
  1. React存在的问题
    为了统一管理状态数据,通常会将数据放在最上层组件中,然后通过props层层传递,传递到底层组件中。如果嵌套太深,参数传递过程非常的复杂。因此出现了Redux。

2. Redux

  1. 基本用法
    Redux中存在几个概念:state, action, dispatch

state: 依旧是组件的内部的状态
action: 组件动作,相应的改变组件内部的状态值
dispatch: 发出相应的动作

Redux中提供createStore方法用于生成一个store对象,这个函数接受一个初始值state值和一个reducer函数。当用户发出相应的action时,利用传入的reducer函数计算出一个新的state值,并返回。

store对象中包括getState方法(获取目前的state),subscribe方法(指定监听函数,当state变化时调用),dispatch方法(分发action)。

在使用过程中,需要将store作为参数传递给子组件。

// reducer
function counter(state = 0, action) {
  switch (action.type) {
    case 'ADD':
      return state + 1;
    case 'SUB':
      return state - 1;
    default:
      return 10;
  }
}

// 创建Store
let store = createStore(counter);
console.log(store.getState()); // 10

// 监听器
function listener() {
  console.log(store.getState()) // 先输出11,在输出10
}

// 订阅事件监听
store.subscribe(listener);

// 分发事件
store.dispatch({ type: 'ADD' });

store.dispatch({ type: 'SUB' });
  1. react-redux
    react-redux是为了方便开发,提供了一个Provider组件,以及connect方法。Provider组件作为做上层组件,需要将store作为参数注入组件中,此后在子组件中都可以访问到store这个对象;connect方法接受两个参数:mapStateToProps,actionCreators,并返回处理后的组件,其中mapStateToProps可以将对应的state作为prop注入对应的子组件,actionCreator可以将对应的actioncreator作为prop注入对应的子组件。
// 定义Connect,将对应的数据注入
const mapStateToProps = (state) => {
  return { num: state }// 必须返回一个对象
};
const actionCreator = { addAction, subAction, addActionAsync }

App = connect(mapStateToProps, actionCreator)(App)

装饰器写法:

@connect(
  (state) => ({ num: state.counter }),
  { addAction, subAction, addActionAsync }
)

使用上述写法,需要安装babel插件babel-plugin-transform-decorators-legacy,并且在babelrc中添加相应的配置

 npm install --save-dev babel-plugin-transform-decorators-legacy
 "plugins": [
   "transform-decorators-legacy"
]

3. React-router

react-router提供了web和Native两个版本,当在浏览器中使用时,需要安装react-router-dom

npm install --save react-router-dom

react-router-dom中提供了BrowserRouter, Link, Route, Switch,Redirect。
其中:
BrowserRouter包裹所有需要路由控制的内容,在使用redux时,需要放置在Provider组件中。
Link组件用于链接某个路径下,用户点击跳转
Route组件用于路由到这个组件
Switch组件用于在内部Route组件中选一个
Redirect组件用于重定向到某个路径下

<Provider store={store}>
    <BrowserRouter>
      <Switch>
        <Route path="/" exact component={Dashboard}></Route>
        <Route path="/login" component={Auto}></Route>
        <Route path="/dashboard" component={Dashboard}></Route>
        <!-- <Redirect to="/dashboard"></Redirect>     -->
        <!-- <Link to="/dashboard"></Link> -->
      </Switch>
    </BrowserRouter>
  </Provider>,

4. 多个reducer

当存在多个reducer,分别管理不同方面的state,需要将其合并成一个reducer,redux中提供了combineReducers函数,完成该项功能。

combineReducers({ counter, auth }) //返回合并后的reducer

5. React-devtools Redux-devtool安装

这两个插件可直接在Chrome商店中安装,React-devtools可直接使用,Redux-devtool则需要在代码中进行相应的设置才能正常使用。

// 配置Redux-devtools

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(thunk),
  // other store enhancers if any
);

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

推荐阅读更多精彩内容