Heim > Artikel > Web-Frontend > Teilen Sie ein React-Übungsprojekt
Das letzte Mal haben wir über die Verwendung von React zum Schreiben einer Homepage mit einem Header gesprochen. Dieses Mal werden wir Redux für die Statusverwaltung in der Praxis verwenden
Der gesamte Status in der Anwendung wird in einem einzigen Speicher in Form eines Objektbaums gespeichert.
Die einzige Möglichkeit, den Zustand zu ändern, besteht darin, eine Aktion auszulösen, ein Objekt, das beschreibt, was passiert ist.
Um zu beschreiben, wie Aktionen den Zustandsbaum ändern, müssen Sie Reduzierer schreiben.
Als nächstes beginnen wir mit der Statusverwaltung von Anmeldung und Registrierung
Erstellen Sie zunächst den Ordner src
im Verzeichnis redux
. Das Verzeichnis lautet wie folgt:
digag ├── README.md ├── node_modules ├── package.json ├── .gitignore ├── public │ └── favicon.ico │ └── Teilen Sie ein React-Übungsprojekt.html │ └── manifest.json └── src └── components └── Index └── Header.js └── LoginDialog.js └── RegisterDialog.js └── containers └── App └── App.js └── App.css └── redux └── action └── users.js └── reducer └── auth.js └── users.js └── sagas └── api.js └── sagas.js └── selectors.js.js └── users.js └── store └── store.js └── App.test.js └── Teilen Sie ein React-Übungsprojekt.css └── Teilen Sie ein React-Übungsprojekt.js └── logo.svg └── registerServiceWorker.js
Code hier verfügbar
Denken Sie daran, Abhängigkeiten in package.json
Aktion
action/users .js
/* * action 类型 */ export const REGISTER_USER = 'REGISTER_USER'; // 省略其他action 类型 /* * action 创建函数 */ export const registerAction = (newUser) => { return{ type:REGISTER_USER, data: newUser, } }; // 省略其他 action 创建函数
Reducer
Reducer/users.js
//Immutable Data 就是一旦创建,就不能再被更改的数据。 //对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对象。 import Immutable from 'immutable'; //从 action 导入需要的 action 类型 import {REGISTER_USER, REGISTER_USER_SUCCESS, REGISTER_USER_FAILURE} from '../action/users'; // 初始化状态 const initialState = Immutable.fromJS({ newUser: null, error: null, saveSuccess: false, }); // reducer 就是一个纯函数,接收旧的 state 和 action,返回新的 state。 export const users = (state = initialState, action = {}) => { switch (action.type) { // 判断 action 类型 case REGISTER_USER: return state.merge({ // 更新状态 'newUser': action.data, 'saveSuccess': false, 'error': null, }); case REGISTER_USER_SUCCESS: return state.set('saveSuccess', action.data); case REGISTER_USER_FAILURE: return state.set('error', action.data); default: return state } };
store
store/store.js
import {createStore, combineReducers, applyMiddleware } from 'redux'; import createSagaMiddleware from 'redux-saga' import * as reducer from '../reducer/users'; import rootSaga from '../sagas/sagas'; const sagaMiddleware = createSagaMiddleware(); const store = createStore( combineReducers(reducer), applyMiddleware(sagaMiddleware) ); sagaMiddleware.run(rootSaga); export default store;
store
src/Teilen Sie ein React-Übungsprojekt.js
import {Provider} from 'react-redux'; import store from './redux/store/store'; // 省略其他 ReactDOM.render( <provider> <app></app> </provider>, document.getElementById('root') );Aktion und Status in App.js abrufen
import {registerAction, loginAction} from '../../redux/action/users'; import {connect} from "react-redux"; import {bindActionCreators} from "redux"; //省略其他 class App extends Component { render(){ return( <div> //省略 </div> ) } } export default connect( (state) => { // 获取状态 state.users 是指 reducer/users.js 文件中导出的 users // 可以 `console.log(state);` 查看状态树 return { users: state.users } }, (dispatch) => { return { // 创建action registerActions: bindActionCreators(registerAction, dispatch), loginActions: bindActionCreators(loginAction, dispatch), } })(App); // 在App 组件的props里就有 this.props.users this.props.registerActions this.props.loginActions 了 // 需要注意的是这里this.props.users是Immutable 对象,取值需要用this.props.users.get('newUser') // 也可在 reducer 里改用 js 普通对象Decorator-Version:
Der Decorator muss in Babel aktiviert werden
Decorator-Plug-inbabel-plugin-transform-decorators-legacy
@connect( (state) => { console.log(state); return ({ users: state.users, }); }, {registerActions: registerAction, loginActions: loginAction} )Übergeben Sie abschließend
registerActions
// 省略其他代码 handleSubmit = (e) => { e.preventDefault(); // 验证表单数据 this.refs.user.validate((valid) => { if (valid) { // this.state.user 为表单收集的 用户注册数据 this.props.registerActions(this.state.user); this.setState({loading: true}); } }); };Der Prozess ist:
this.props.registerActions(this.state.user);
und die Aktion als
{ type:REGISTER_USER, data: this.state.user, }
switch (action.type) { case REGISTER_USER: return state.merge({ 'newUser': action.data, 'saveSuccess': false, 'error': null, }); //省略其他代码Zu diesem Zeitpunkt wird der Status in unserem Shop
auf die im Registrierungs-Popup-Fenster gesammelten Daten aktualisiert newUser
Bis hierhin Punkt: Es handelt sich immer noch um eine synchrone Aktion, während die Registrierung eine asynchrone Aktion ist.
Das obige ist der detaillierte Inhalt vonTeilen Sie ein React-Übungsprojekt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!