第一次使用react-redux时,到网【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net上搜各种资料学习,结果发现一大堆资料全在转载请注明出处:www.tangshuang.net【转载请注明来源】谈redux,搞的蒙头转向。这些文章的作【版权所有,侵权必究】【转载请注明来源】者忽略了一个问题,对于新手而言,其实更多【本文首发于唐霜的博客】【原创不易,请尊重版权】的是要从自己熟悉的知识体系去延生开,而不【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】是上来搞一堆概念。和这些资料不同,我写这本文版权归作者所有,未经授权不得转载。【作者:唐霜】篇文章,反其道而行,直接先将react中本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】使用react-redux,然后慢慢反推【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。redux。对于读者而言,更多的是从已知未经授权,禁止复制转载。原创内容,盗版必究。的react知识推演过去,理解之后再去理原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】解redux。
【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】安装未经授权,禁止复制转载。
【作者:唐霜】本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】npm install --save redux react-redux
安装react-redux时要一起安装r【本文受版权保护】【本文受版权保护】edux,因为我们要用到redux的一个【转载请注明来源】【未经授权禁止转载】方法,但这个方法我们只管用,不用深纠。
【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net【版权所有,侵权必究】【作者:唐霜】改造入口文件【版权所有,侵权必究】
著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。一般我们会有一个入口文件,我一般使用in著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.netdex.js,因为react是一个组件的著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】UI构建库,所以对于一个web应用而言,【原创不易,请尊重版权】【本文受版权保护】一切都是组件。但是在入口文件里,我不是再【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】写组件,而是在写把组件挂载到DOM里面,本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net所以,我的index.js是这样写的:
【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。【本文受版权保护】本文版权归作者所有,未经授权不得转载。import React from 'react'
import { render } from 'react-dom'
import { HashRouter as Router, Route } from 'react-router-dom'
import App from './App'
import './styles/index.scss'
render(
<Router>
<Route path='/' component={App} />
</Router>
,
document.getElementById('app'),
)
这样的代码结构就非常简明。就是利用rea【原创不易,请尊重版权】转载请注明出处:www.tangshuang.netct-dom来渲染到#app这个div中【转载请注明来源】【本文受版权保护】。
原创内容,盗版必究。原创内容,盗版必究。【版权所有,侵权必究】react中的组件在我看来有两类,一类是【本文受版权保护】本文版权归作者所有,未经授权不得转载。纯粹的UI组件,比如一个弹出框、下拉菜单原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。、tooltip等等,它们是独立的,在任【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net何应用中都可以复用,只要传props就可【本文受版权保护】【转载请注明来源】以了。而另一类,则称之为业务组件,包括整【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。个页面的布局、数据交互等等,这类组件实际原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。上通过对纯UI组件的包装,实现了真正的应【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】用的业务作用。不同的应用,可以用相同的U【原创不易,请尊重版权】【作者:唐霜】I组件库,但自己的业务必须靠自己完成。所【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】以,虽然都叫组件,但是业务组件的复用性往转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。往仅限于同一个应用中。
【本文首发于唐霜的博客】【本文受版权保护】【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】现在我们要改造这个入口index.js文转载请注明出处:www.tangshuang.net【未经授权禁止转载】件来使用react-redux。
转载请注明出处:www.tangshuang.net【本文受版权保护】【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】我们假设改造的目的,是在App组件中加入本文作者:唐霜,转载请注明出处。【本文受版权保护】一个loading效果,这个loadin【作者:唐霜】【版权所有】唐霜 www.tangshuang.netg效果可以被App的任何子组件触发,也就著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。是说整个应用只有一个loading,但是未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net在任何地方都可以显示/隐藏。react-【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】redux的作用就是建立一套所有组件都可【转载请注明来源】转载请注明出处:www.tangshuang.net以访问的state系统,这个系统被称为s【作者:唐霜】【未经授权禁止转载】tore。玩过vuex的小伙伴应该秒懂。【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net不懂也不要紧,简单的说就是store里面【原创不易,请尊重版权】【原创不易,请尊重版权】存放了一堆state,同时store提供【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net了获取state的方法getState,【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net修改state的方法dispatch,以【本文受版权保护】未经授权,禁止复制转载。及监听state被改动的方法subscr原创内容,盗版必究。转载请注明出处:www.tangshuang.netibe。但是这三个方法对于我们使用rea【版权所有,侵权必究】【未经授权禁止转载】ct-redux的小伙伴而言,只需要用到本文作者:唐霜,转载请注明出处。【作者:唐霜】dispatch方法,我们会把state【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net直接注入到组件的props中,而监听st著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】ate变化后重新渲染界面react-re本文版权归作者所有,未经授权不得转载。【作者:唐霜】dux已经自动完成了。
本文作者:唐霜,转载请注明出处。【转载请注明来源】本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】改造后的代码如下:【访问 www.tangshuang.net 获取更多精彩内容】
著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。import React from 'react'
import { render } from 'react-dom'
import { HashRouter as Router, Route } from 'react-router-dom'
import { Provider } from 'react-redux'
import { createStore } from 'redux'
import App from './App'
import './styles/index.scss'
const store = createStore((state, action) => {
if (action === 'showLoading') return { loading: true }
return { loading: false }})
/**
* action就是在组件里面调用dispatch方法的时候传入的参数,怎么在组件中调用下文会讲
* state就是全局state,其实和组件内的this.state是一个道理,都是一个对象
* return后面是一个新的state,这个state会覆盖上一个state
* 有一点必须注意,这个地方return的state必须是一个新的object,而不能直接通过修改state之后return回来,比如下面这种操作就是错的:
* state.loading = false; return state; // 这样做绝对不行,谨记!
* 如果你的state有很多个属性,要使用Object.assign进行克隆,再这样操作:
* let newState = Object.assign(state); newState.loading = false; return newState; // 这样可以
*/
render(
<Provider store={store}>
<Router>
<Route path='/' component={App} />
</Router>
</Provider>
,
document.getElementById('app'),
)
Provider组件把你的整个App项目【本文受版权保护】【原创不易,请尊重版权】的组件包含起来,那么这些包含起来的组件(原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】以及它们的子组件)就可以被提供react著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net-redux的注入。注意,我这里说的是“【未经授权禁止转载】【版权所有,侵权必究】可以”,而不是一定,要实现真正使用rea【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】ct-redux,我们还要改造Provi本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】der包含起来的组件才行。
著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】【转载请注明来源】【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。改造组件【版权所有,侵权必究】
原创内容,盗版必究。【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net前面说了,用Provider组件包起来的未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。组件可以被注入react-redux的功原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net能,那么怎么改造呢?用一个叫connec本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。t的函数对现有组件进行二次构造,得到一个【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】新的组件,将这个组件export出去。
【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。【本文受版权保护】原创内容,盗版必究。我们来看下我原来的App组件是怎么写的:
【转载请注明来源】【原创不易,请尊重版权】【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。【作者:唐霜】import React, { Component } from 'react'
export default class App extends Component {
constructor(props) {
super(props)
this.state = {
loading: false,
}
}
toggleLoading() {
this.setState({
loading: !this.state.loading,
})
}
render() {
return (
<div>
...
<a href="javascript:" onClick={this.toggleLoading.bind(this)}>toggle loading</a>
...
<div className={'loading' + this.state.loading ? '' : ' hidden'}>loading...</div>
</div>
)
}}
上面我用了组件内的state.loadi【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】ng来控制整个页面的loading是否显转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。示。但是,如果我们要在其他组件中使用lo【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】ading,就必须不断通过子组件的pro【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。ps传递toggleLoading方法,【作者:唐霜】著作权归作者所有,禁止商业用途转载。那也实在太蠢了。
原创内容,盗版必究。【未经授权禁止转载】【本文受版权保护】【本文首发于唐霜的博客】【本文首发于唐霜的博客】解决这个问题的办法有很多,比如通过rea本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.netct提供的props.children来【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net递归注入,使得每一个内部组件都拥有tog未经授权,禁止复制转载。【版权所有,侵权必究】gleLoading方法的调用权限。但是本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】,我们这里使用react-redux来解本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net决,让每一个经过改造的组件都拥有修改st【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。ore中的state的能力,通过修改这个未经授权,禁止复制转载。原创内容,盗版必究。state来达到重新渲染App组件中的l转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。oading的效果。
【转载请注明来源】本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】改造后如下:【版权所有】唐霜 www.tangshuang.net
原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】import React, { Component } from 'react'
import { connect } from 'react-redux'
class App extends Component {
constructor(props) {
super(props)
}
toggleLoading() {
this.props.dispatch('showLoading')
}
render() {
return (
<div>
...
<a href="javascript:" onClick={this.toggleLoading.bind(this)}>toggle loading</a>
...
<div className={'loading' + this.state.loading ? '' : ' hidden'}>loading...</div>
</div>
)
}
}
function mapStateToProps(state) {
return {
loading: state.loading,
}
// 这里的state是react-redux store中的state,前面我们已经写过相关的代码,return { loading: false }
}
export default connect(mapStateToProps)(App)
红色部分是修改后的起作用代码,其实主要实【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。现了两件事,1)将store中的stat【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.nete.loading作为组件的props.【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。loading的值,2)通过connec【原创不易,请尊重版权】原创内容,盗版必究。t实现将dispatch方法注入到组件的未经授权,禁止复制转载。原创内容,盗版必究。props.dispatch。
【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。上面是对App组件的改造,如果你要在其他【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。组件(包括App的子组件)中也想对loa著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。ding界面进行控制,也可以参照上面的代【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。码进行改造。改造之后,这些组件仅仅和re本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。act-redux产生了依赖关系,组件与【版权所有,侵权必究】【版权所有,侵权必究】组件完全解耦,但是却可以通过react-【转载请注明来源】【原创内容,转载请注明出处】redux作为桥梁,相互控制对方的UI展本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】示。
未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net【版权所有,侵权必究】转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。遗留问题【版权所有】唐霜 www.tangshuang.net
【作者:唐霜】【未经授权禁止转载】未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】你可能会想,如果一个组件必须依赖reac【本文首发于唐霜的博客】未经授权,禁止复制转载。t-redux,那么它的独立性是不是减弱未经授权,禁止复制转载。未经授权,禁止复制转载。了?是的,这是一定的,所以我前文小字部分【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。已经说了,业务型组件本身就对整个项目的数【原创内容,转载请注明出处】【本文首发于唐霜的博客】据结构之类的有依赖。比如说这里改造后的A【本文首发于唐霜的博客】【本文受版权保护】pp组件,在mapStateToProp【版权所有,侵权必究】【原创内容,转载请注明出处】s函数中我们直接使用了state.loa【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。ding,假如state是一个null不本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】就会报错么?那是因为我们在Provide转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】r的时候就已经知道state一定有loa本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】ding属性,所以这肯定是有依赖的。因此原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】,redux的规则里面明确说了要将UI和原创内容,盗版必究。转载请注明出处:www.tangshuang.net业务分离开发的思想。
【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net原创内容,盗版必究。当然,你肯定还会有其他疑虑,比如说sta著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。te很庞大怎么办?react-redux本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。是怎么做到自动更新界面的?connect【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。具体的用法是什么?等等这样的问题。这些问转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】题本文都不会回答,希望有机会可以深入去写【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。,下面给一些参考资料:
【作者:唐霜】【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。【作者:唐霜】- Redux 入门教程(一):基本用法【原创内容,转载请注明出处】 转载请注明出处:www.tangshuang.net【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。【转载请注明来源】
- React 实践心得:react-red【本文受版权保护】原创内容,盗版必究。ux 之 connect 方法详解 【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】
- 使用真正的 Redux 和 React-著作权归作者所有,禁止商业用途转载。【作者:唐霜】redux 转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。


