可先檢察我的redux簡樸入門
react-redux簡介
react-redux是運用redux開闢react時運用的一個插件,別的插一句,redux不是react的產物,vue和angular中也可以運用redux;下面簡樸解說,怎樣運用react-redux來開闢react。
形貌
這個插件可以讓我們的redux代碼越發的簡約和雅觀。我假定你已有一個運用create-react-app
建立的一個可以顯現hello world的react環境,而且已裝置來redux。
注重:如果是剛運用create-react-app
建立的,須要運轉 npm run eject
彈出個性化設置,如許就可以自定義設置了。
裝置
npm i react-redux --save
運用
react-redux供應了兩個主要的接口:Provider、connect
,運用了這個插件,react-redux的subscribe和dispatch就可以遺忘來,它們就用不着了。
代碼構造
//index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import { reducer } from './index.redux';
import { Provider } from 'react-redux'
const store = createStore(reducer, applyMiddleware(thunk));
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
);
registerServiceWorker();
Provider中運用的最外層,把store傳給它,只運用這一次。
//app.js
import React, { Component } from 'react';
import { addCreator, removeCreator, addAsync } from './index.redux';
import { connect } from 'react-redux';
class App extends Component {
render() {
return (
<div className="App">
<h1>如今有玉人{this.props.num}個。</h1>
<button onClick={this.props.addCreator}>add</button>
<button onClick={this.props.removeCreator}>remove</button>
<button onClick={this.props.addAsync}>addAsync</button>
</div >
);
}
}
//定義把state中哪一個屬性放到props中
function mapStateToProps(state) {
return { num: state }
}
//定義把哪些要領放到props中
const actionCreators={ addCreator, removeCreator, addAsync };
//connect實在就是一個高階組件,把app傳進去,返回一個新的app組件
App = connect(mapStateToProps, actionCreators)(App);
export default App;
connect
擔任從外部獵取組件須要的參數。經由過程connect
定義后,放到props
中的屬性和要領就可以直接經由過程this.props
來獵取。
下面是reducer的定義。
//react.redux.js
const Add = 'addGirl', Remove = "removeGirl";
export function reducer(state = 0, action) {
switch (action.type) {
case Add:
return state + 1;
case Remove:
return state - 1;
default:
return 10;
}
}
export function addCreator() {
return { type: Add };
}
export function removeCreator() {
return { type: Remove };
}
export function addAsync() {
return (dispatch, getState) => {
setTimeout(function () {
dispatch(addCreator());
}, 1000);
}
}
運用裝潢器的體式格局更文雅的寫Conect
起首須要裝置babel-plugin-transform-decorators-legacy
,並在package.json
中設置。
裝置
npm i babel-plugin-transform-decorators-legacy --save-dev
這個只是開闢運用,所以裝置到–save-dev
設置
設置babel的plugins屬性
"babel": {
"presets": [
"react-app"
],
"plugins": [
["transform-decorators-legacy"]
]
}
修正本來寫法
運用@connect
來從新定義,寫到class的上頭即可。
//App.js
@connect((state) => ({ num: state }),{ addCreator, removeCreator, addAsync })
class App extends Component {
.....//省略
// function mapStateToProps(state) {
// return { num: state }
// }
// App = connect(mapStateToProps, { addCreator, removeCreator, addAsync })(App);
VS Code 裝潢器提醒“experimentalDecorators”的解決辦法
點擊Visual Studio Code左下角的設置按鈕(或許文件>首選項>設置,Windows環境),翻開用戶設置窗口,在搜刮框內輸入“experimentalDecorators”,發明居然可以找到選項,以下:
"javascript.implicitProjectConfig.experimentalDecorators": false
改成true
就可以了。