看到很多小伙伴一见到redux就头疼,笔者今天就来说说这个redux吧。
redux及其中间件介绍,参考:https://blog.csdn.net/lilygg/article/details/118256153
redux是一个
Redux三大原则:单一数据源、State是只读的、使用纯函数来执行修改。
Redux用法真没啥复杂的,简单的说吧,
Redux是一个js库,通过里边的createStore(reducer)可以生成一个store,把它导出来就可以在组件里边使用。组件需要更改数据,只需要store.dispatch({action:xx,payload:nnn})派发这样一个动作即可。
这个动作一旦被派发,就会触发reducer函数。reducer是个无副作用的纯函数。它接收两个参数:数据初始值和action对象,
在reducer纯函数里会根据action.type去做不同的数据更改操作,最终返回一个最新的状态,而不是直接更改原始数据。
以上就是redux的基本工作流程。
在组件更改了数据之后,想要做到实时同步(实时更新数据),需要开发者手动调用store.subscribe(()=>{ //在需要拿redux数据的地方进行数据拿取操作}),实时监听store仓库中数据的变化。
想要拿到redux里的xxx数据,可以通过store.getState().xxx拿到数据xxx。
好了,光说不练假把式,大家也是看得云里雾里,废话不多说,talk is cheap,show me your code.
示例代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <!-- 页面演示 --> <button id="increment">+</button> <span id="count">0</span> <button id="decrement">-</button> <!-- 直接把redux包拔下来引入 --> <script src="./redux.min.js"></script> <script> var initialState = { count:1 } function reducer(state=initialState,action){//action是构建redux时定义好的操作 switch (action.type) { case 'incrementAction': return {...state,count:state.count+1} case 'decrementAction': return {...state,count:state.count-1} default: return state; } return state; } //创建状态 var store = Redux.createStore(reducer); //获取redux状态中的值 console.log(store.getState());//{count:1} //添加点击事件 document.getElementById('increment').addEventListener('click',(res) => { store.dispatch({type:'incrementAction'}) }); document.getElementById('decrement').addEventListener('click',(res) => { store.dispatch({type:'decrementAction'}) }); //监听redux状态值的变化 store.subscribe(() => { //把状态中的值注入到dom中 document.getElementById('count').innerText=store.getState().count; }) </script> </body> </html>
原文地址:http://www.cnblogs.com/yanglongbo/p/16800105.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性