可先查看我的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.jsimport 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.jsimport 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.jsconst 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就可以了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。
新聞熱點
疑難解答