自学react第三天
标签:reactRedux由Dan Abramov在2015年创建的科技术语。是受2014年Facebook的Flux架构以及函数式编程语言Elm启发。很快,Redux因其简单易学体积小在短时间内成为最热门的前端架构。
简介
Redux对于JavaScript应用而言是一个可预测状态的容器。换言之,它是一个应用数据流框架,而不是传统的像underscore.js或者AngularJs那样的库或者框架。 Redux最主要是用作应用状态的管理。简言之,Redux用一个单独的常量状态树(对象)保存这一整个应用的状态,这个对象不能直接被改变。当一些数据变化了,一个新的对象就会被创建(使用actions和reducers)。
示例1
git clone https://github.com/reduxjs/redux.git
cd redux/examples/counter-vanilla/
yarn
yarn start
然后就看到报错了:
redux/examples/counter-vanilla/index.html: Duplicate plugin/preset detected.
If you'd like to use two separate instances of a plugin,
they need separate names, e.g.
plugins: [
['some-plugin', {}],
['some-plugin', {}, 'some unique name'],
]
查看package.json,一共就用到两个包
"devDependencies": {
"@babel/core": "^7.2.0",
"parcel-bundler": "^1.6.1"
}
那么一个是这两个包有冲突,当前都用的最新版本7.3.4和1.11.0。 把其中的“parcel-bundler”指定为“~1.6.1”就可以了! 成功启动命令行会显示
yarn run v1.10.1
warning package.json: No license field
$ parcel index.html --open
Server running at http://localhost:1234
✨ Built in 101ms.
这里我们要了解的是“Parcel是和webpack类似的打包神器”。
然后我们来看示例的代码
<!DOCTYPE html>
<html>
<head>
<title>Redux basic example</title>
<script src="https://unpkg.com/redux@latest/dist/redux.min.js"></script>
</head>
<body>
<div>
<p>
Clicked: <span id="value">0</span> times
<button id="increment">+</button>
<button id="decrement">-</button>
<button id="incrementIfOdd">Increment if odd</button>
<button id="incrementAsync">Increment async</button>
</p>
</div>
<script>
function counter(state, action) {
if (typeof state === 'undefined') {
return 0
}
switch (action.type) {
case 'INCREMENT':
return state + 1
case 'DECREMENT':
return state - 1
default:
return state
}
}
var store = Redux.createStore(counter)
var valueEl = document.getElementById('value')
function render() {
valueEl.innerHTML = store.getState().toString()
}
render()
store.subscribe(render)
document.getElementById('increment')
.addEventListener('click', function () {
store.dispatch({ type: 'INCREMENT' })
})
document.getElementById('decrement')
.addEventListener('click', function () {
store.dispatch({ type: 'DECREMENT' })
})
document.getElementById('incrementIfOdd')
.addEventListener('click', function () {
if (store.getState() % 2 !== 0) {
store.dispatch({ type: 'INCREMENT' })
}
})
document.getElementById('incrementAsync')
.addEventListener('click', function () {
setTimeout(function () {
store.dispatch({ type: 'INCREMENT' })
}, 1000)
})
</script>
</body>
</html>
这个例子展示了Redux 最核心的 API —- createStore,通过 createStore 方法创建的 store 是一个对象 它本身又包含4个方法。
- getState():获得store中当前的状态。
- dispatch(action):分发一个action,并返回这个 action,这是唯一能改变 store 中数据的方式。
- subscrible(listener): 注册一个监听者,他在 store 发生变化时被调用。
- replaceReducer(nextReducer):更新当前 store 里的reducer,一般只会在开发模式中调用该方法。
在实际应用中,我门最常用的是 getState() 和 dispatch() 这两个方法。至于subscribe() 和 replaceReducer() 方法,一般会在 Redux 与某个系统(如 React ) 做桥接的时候使用。
Written on 2019-02-25
上篇:
自学react第二天
下篇:
基本的ELK日志分析系统搭建