redux与react-redux

Store:

Store是保存数据的地方,可以看成一个容器。整个应用只能有一个 Store。
Redux 提供createStore这个函数,用来生成 Store。
import { createStore } from 'redux';
const store = createStore(fn);
createStore函数接受一个函数作为参数,返回新生成的 Store 对象。

State:

Store对象包含所有数据。state就是某个时刻对 Store 生成的一个快照,通过store.getState()得到:
const state = store.getState();
Redux 中一个 State 对应一个 View。只要 State 相同,View 就相同。

action:

action是一个对象,必须含有type属性,表示action的名称,一般语义化为要做的行为,

store.dispatch(action):

dispatch会将action(行为)发送给store,触发行为

Reducer(state,action):

Store 收到 Action 以后,必须给出一个新的 State,这样 View 才会发生变化。这种 State 的计算过程就叫做 Reducer.
Reducer是一个纯函数,接受 Action 和当前 State 作为参数,返回一个新的 State。

store.subscribe(listener):

store.subscribe方法是设置监听函数,当State 发生变化时就自动执行这个函数。
View的更新函数(对于 React 项目,是组件的render方法或setState方法)放入listen,就会实现 View 的自动渲染。
store.subscribe方法返回一个函数,调用这个函数就可以解除监听。

createStore实现:

const createStore = (reducer)=>{
		let state;
		let list = [];//作为一个容器,保存
		const getState = ()=>{
			return state;
		}
		const subscribe = (fn)=>{
			list.push(fn);
			//	返回一个函数,执行函数时,取消回调函数的执行
			return ()=>{
				list = list.fibter((cb)=>{
					return cb != fn;
				});
			}
		}
		//	dispatch时,有行为action,就会更新state
		const dispatch = ( action )=>{
			state = reducer(state,action);
			list.forEach( (fn)=>{
				fn();
			} );
		}
		return { getState, subscribe, dispatch }
}

Context:

当组件之间嵌套的层级过多时,就需要在每一层级进行传递,而这种传递对日后的维护成本十分巨大,Context 提供了一个无需为每层组件手动添加 props,就能在组件树间进行数据传递的方法。
某些属性是应用程序中许多组件都需要的。Context 提供了一种在组件之间共享此类值的方式,而不必显式地通过组件树的逐层传递 props(即Context 主要应用场景在于很多不同层级的组件需要访问同样一些的数据。请谨慎使用,因为这会使得组件的复用性变差。):

  1. 为需要多重传递的属性创建一个全局context:const ThemeContext = React.createContext('light'); //light是默认值
  2. 在父组件的 render()函数内写:
    render() {
    // 使用一个 Provider 来将当前的 theme 传递给以下的组件树。
    // 无论多深,任何组件都能读取这个值。
    // 在这个例子中,我们将 “dark” 作为当前的值传递下去。
    	return (
    		//	将此全局context.Provider以标签的形式写在最外围
    		//	将 “dark” 作为要传递的值
      		<ThemeContext.Provider value="dark">
        		<ThemedButton/>    //	子组件
      		</ThemeContext.Provider>
    	);
    }
    
  3. 在子组件中:
    class ThemedButton extends React.Component {
    	// 指定 contextType 读取当前的 theme context。
    	// React 会往上找到最近的 theme Provider,然后使用它的值。
    	// 在这个例子中,当前的 theme 值为 “dark”。
    	//	使用this.context获取到值
    	static contextType = ThemeContext;
    	render() {
    		 return <Button theme={this.context} />;
    	}
    }
    

React-Redux:

React-Redux是React的专用库,实际项目可使用Redux或者React-Redux。
React-Redux将组件分为两类:UI组件和容器组件
其中UI组件(纯组件)只负责UI呈现,不负责业务逻辑,没有状态(this.state),所需数据由this.prop提供,不使用Redux的API。
而容器组件使用Redux的API,带有内部状态,并且容器组件由React-Redux自动生成。
connect方法,从UI组件生成容器组件,借鉴了Conntext的实现思想:即将状态的数据放置在外组件,其API如下:

import {} from 'react-redux'
const mapStateToProps = (state)=>{
	return {
		todos:getVisibleTodos(state.todos,state.visiblityFilter)   	//	getVisibleTodos函数用来计算需要state中的哪些值
		}
}
const mapDispatchToProps = (dispatch)=>{
	return {
		onClickTodo:() =>{    // onClickTodo是UI组件中要被触发的事件,触发后执行dispatch
			dispatch({
				type:'TOGGLE_TODO',
				id
			})
		}
	}
}
const VisibleTodoList = connect(mapStateToProps,mapDispatchToProps)(TodoLIst);

connect函数接受两个函数参数,返回一个函数,返回的函数的参数是UI组件(此处是TodoLIst),该方法会自动生成一个容器组件,并将其连接。
形参mapStateToProps是一个函数,负责将state映射到UI组件的props上,mapStateToProps()接受一个参数state,返回所需要的状态值。
形参mapDispatchToProps也是一个函数,负责将操作逻辑(行为事件)映射到UI组件的Action。mapDispatchToProps()接收dispatch,在事件中执行action.

connect实现:

上面已经分析了connect的功能,接下来根据其功能实现connect函数:

const connect = (mapStateToProps,mapDispatchToProps) => {
	return (WrapperComponent)=>{
		//	定义一个容器包裹UI组件,利用父节点更新会自动更新子组件的特性来自动更新子组件 
		class Connect extends Component{
			componentDidMount(){
				//	利用跨多级组件通信context得到store,此处使用旧的API,w未来会废弃
				const store = this.context.store;
				this.unsubscribe = store.subscribe(()=>{
					this.forceUpdate();
				});
			}
			componentWillUnmount(){
				this.unsubscribe();
			}
			//	以上代码实现自己更新自己的功能。
			render(){
				const store = this.context.store;
				const stateProps = mapStateToProps(store.getState());	//返回当前需要的属性
				const dispatchProps = mapDispatchToProps(store.dispatch);		//	返回当前所需的方法
				const props = Object.assign({},stateProps,dispatchProps);
				return React.createElement(WrapperComponent,props);	    //	创建UI组件的ReactDom节点,并将数据函数传入UI组件的props
			}
		}
		Connect.contextTypes = {
			store:React.PropTypes.object
		}
		return Connect;
	}
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Redux是一个独立的JavaScript库,用于管理应用程序的状态。它提供了一个可预测的状态容器,可以在整个应用程序中共享。Redux通过单向数据流来管理状态,使得状态的变化变得可控和可预测。 React-ReduxRedux的官方绑定库,它提供了一些与React集成的功能,使得在React应用中使用Redux更加方便。React-Redux提供了一个Provider组件,它可以将Redux store传递给整个应用程序。它还提供了一个connect函数,它可以将Redux store中的状态映射到React组件的props中,使得React组件可以轻松地访问Redux store中的状态。 ### 回答2: Redux是一个用于JavaScript应用程序的状态容器,它提供了一个可预测且可维护的方式来管理应用程序的状态。Redux的核心概念是“单一数据源”,即将整个应用程序的状态存储在单一对象树中,并且任何组件都可以访问和修改该状态树的任意部分。 react-redux是一个与React紧密集成的Redux绑定库。它提供了一组React组件和API,使得使用ReduxReact应用程序中更加容易。 reduxreact-redux之间的关系可以理解为Redux是一种状态管理库,而react-reduxReduxReact之间的纽带。 具体来说,react-redux提供了两种主要的API:Provider和connect。 Provider是一个React组件,允许我们将应用程序的Redux存储连接到React组件树中的所有组件。在Provider组件内部,可以通过store属性传递Redux存储对象,使得所有组件都可以访问该存储。 connect是一个高阶组件,用于将React组件连接到Redux存储中的状态和操作。通过connect,我们可以在React组件中访问Redux状态,以及派发Redux操作。connect本质上是一个函数,它接收一个组件作为参数并返回一个新的连接了Redux存储的组件。 总之,reduxreact-redux之间的区别在于,redux是一个独立的状态管理库,而react-reduxReduxReact之间的桥梁,帮助React应用程序连接到Redux存储,并访问存储中的状态和操作。 ### 回答3: ReduxReact-Redux都是在React项目中使用的JavaScript库。Redux是一个JavaScript状态容器,用于管理应用程序中的所有状态。Redux允许将状态存储在一个单一的地方,以便在整个应用程序中共享该状态。React-ReduxReact的一个库,用于与Redux一起使用,以便在React组件中访问和更新Redux状态。 Redux通过store提供一个单一的状态树,包含了整个应用程序的状态。通过使用store中的action和reducer,Redux可以跟踪状态的所有更改。这可以帮助开发人员更容易地调试和管理代码。但是,使用Redux需要一定的时间和精力来管理各个状态,尤其在较大的代码库中尤其如此。 React-Redux库是Redux的一个扩展,它提供了一组工具来帮助React组件访问和更新Redux状态。通过提供Provider组件,React-Redux使得Redux存储的状态可以传递到整个应用程序中的所有组件。通过使用connect函数和mapStateToProps和mapDispatchToProps参数,React-Redux允许开发人员将Redux状态映射到React组件中。这样,开发人员就可以根据需要将Redux状态作为props传递给组件,并且可以更方便地将状态更改传递回Redux store。 总之,ReduxReact提供了一个易于管理的状态储存架构,以帮助应用程序开发人员管理和跟踪应用程序状态。React-Redux是一组工具,它使开发人员可以更方便地在React组件中使用Redux,从而帮助开发人员更快地开发应用程序。两者的区别在于Redux是包含整个应用程序状态的状态容器,而React-Redux则是提供了一组工具,以帮助开发人员更方便地在React组件中使用Redux状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值