使用React?Redux實現(xiàn)React組件之間的數(shù)據(jù)共享
實現(xiàn)React組件之間的數(shù)據(jù)共享:使用React Redux
在復雜的React應用中,組件之間的數(shù)據(jù)共享是必不可少的。為了解決這個問題,可以使用React Redux來管理應用的狀態(tài),并實現(xiàn)組件之間的數(shù)據(jù)共享。在本文中,我們將介紹如何使用React Redux實現(xiàn)Count和Person組件之間的數(shù)據(jù)共享。
1. 準備工作
首先,我們需要安裝React Redux和相關的依賴:
npm install react-redux redux redux-thunk --save
2. 創(chuàng)建Redux Store
Redux Store是一個存儲應用程序狀態(tài)的容器,它提供了一種統(tǒng)一管理狀態(tài)的機制。在創(chuàng)建Redux Store之前,我們需要先定義應用程序的狀態(tài)結構,并編寫相應的Reducer函數(shù)來處理狀態(tài)的變化。接下來,讓我們一步步創(chuàng)建Redux Store。
2.1. 定義狀態(tài)結構
在開始創(chuàng)建Redux Store之前,我們需要定義應用程序的狀態(tài)結構。在這個示例中,我們的應用程序包含兩個主要的狀態(tài):count和persons。count狀態(tài)用于存儲計數(shù)器的值,而persons狀態(tài)用于存儲人員信息列表。我們可以在reducers/count.js和reducers/person.js中定義這些狀態(tài)的初始值和處理方法。
// reducers/count.js
import { COUNT_ADD } from '../constant';
const initState = 0;
export default function CountReducer(preState = initState, action) {
const { type, data } = action;
switch (type) {
case COUNT_ADD:
const { value1, value2 } = data;
return value1 + value2;
default:
return preState;
}
}
// reducers/person.js
import { PERSON_ADD } from '../constant';
const initState = [];
export default function PersonReducer(preState = initState, action) {
const { type, data } = action;
switch (type) {
case PERSON_ADD:
return [data, ...preState];
default:
return preState;
}
}
2.2. 創(chuàng)建Redux Store
現(xiàn)在我們可以開始創(chuàng)建Redux Store了。Redux提供了一個createStore函數(shù)用于創(chuàng)建Redux Store,我們需要將應用程序的所有Reducer函數(shù)傳入createStore中,并可選地使用applyMiddleware函數(shù)來應用中間件。
// store.js
import { createStore, applyMiddleware, combineReducers } from 'redux';
import thunk from 'redux-thunk';
import countReducer from './reducers/count';
import personReducer from './reducers/person';
// 組合所有的Reducer
const rootReducer = combineReducers({
count: countReducer,
persons: personReducer,
});
// 創(chuàng)建Redux Store,并應用中間件
const store = createStore(rootReducer, applyMiddleware(thunk));
export default store;
通過上述步驟,我們成功創(chuàng)建了Redux Store,并且應用了中間件。現(xiàn)在我們可以在應用程序中使用這個Redux Store來存儲和管理應用程序的狀態(tài)了。
3. 創(chuàng)建Count組件
Count組件用于展示一個加法計算器,并實現(xiàn)與Redux Store的連接。我們使用connect函數(shù)將Count組件與Redux Store連接起來,并實現(xiàn)數(shù)據(jù)共享:
// containers/Count/index.jsx
import { connect } from 'react-redux';
import React, { Component } from 'react';
import { InputNumber, Button } from 'antd';
import { createAsyncAddAction } from '../../actions/count';
class CountUI extends Component {
state = {
value1: 0,
value2: 0,
}
add = () => {
const { value1, value2 } = this.state;
this.props.add({ value1, value2 });
}
render() {
const { value1, value2 } = this.state;
const { total, persons } = this.props;
return (
<div>
<h2>我是Count組件,Person組件的錄入人數(shù)是:{persons.length}</h2>
<InputNumber value={value1} onChange={ val => this.setState({ value1: val }) } /> +
<InputNumber value={value2} onChange={ val => this.setState({ value2: val }) } />
<Button type="link" onClick={this.add}>=</Button>
{total}
</div>
)
}
}
export default connect(
state => ({ total: state.count, persons: state.persons }),
{
add: createAsyncAddAction,
}
)(CountUI);
4. 創(chuàng)建Person組件
Person組件用于展示一個人員信息表格,并實現(xiàn)與Redux Store的連接。我們同樣使用connect函數(shù)將Person組件與Redux Store連接起來,實現(xiàn)數(shù)據(jù)共享:
// containers/Person/index.jsx
import React, { Component } from 'react';
import { Input, Button, Table } from 'antd';
import { nanoid } from 'nanoid';
import { connect } from 'react-redux';
import { createAddAction } from '../../actions/person';
const columns = [
{
title: '姓名',
dataIndex: 'name',
key: 'name',
},
{
title: '年齡',
dataIndex: 'age',
key: 'age',
},
];
class Person extends Component {
state = {
name: '',
age: '',
}
add = () => {
const { name, age } = this.state;
const person = { key: nanoid(), name, age };
this.props.add(person);
this.setState({ name: '', age: '' });
}
render() {
const { persons, total } = this.props;
const { name, age } = this.state;
return (
<div>
<h2>我是Person組件,Count組件的求和結果是{total}</h2>
<Input
placeholder="姓名"
value={name}
onChange={e => this.setState({ name: e.target.value })}
/>
<Input
placeholder="年齡"
value={age}
onChange={e => this.setState({ age: e.target.value })}
/>
<Button onClick={this.add} type="primary">添加</Button>
<Table dataSource={persons} columns={columns} />
</div>
)
}
}
export default connect(
state => ({ persons: state.persons, total: state.count }),
{
add: createAddAction,
}
)(Person);
5. 整合React組件
最后,我們在應用的入口文件中將Count和Person組件放置在Provider組件中,以便整個應用可以訪問Redux Store中的狀態(tài):
// App.jsx
import React, { Component } from 'react';
import { Provider } from 'react-redux';
import store from './store';
import Count from './containers/Count';
import Person from './containers/Person';
export default class App extends Component {
render() {
return (
<Provider store={store}>
<Count />
<hr />
<Person />
</Provider>
)
}
}

結語
通過以上步驟,我們成功實現(xiàn)了React組件之間的數(shù)據(jù)共享。Count組件和Person組件通過Redux Store共享數(shù)據(jù),實現(xiàn)了狀態(tài)的統(tǒng)一管理和更新。這種基于React Redux的數(shù)據(jù)管理方式,能夠有效地提高應用的可維護性和擴展性,是構建復雜應用的一種有效方式。
參考
以上就是使用React Redux實現(xiàn)React組件之間的數(shù)據(jù)共享的詳細內(nèi)容,更多關于React Redux組件數(shù)據(jù)共享的資料請關注腳本之家其它相關文章!
相關文章
webpack手動配置React開發(fā)環(huán)境的步驟
本篇文章主要介紹了webpack手動配置React開發(fā)環(huán)境的步驟,webpack手動配置一個獨立的React開發(fā)環(huán)境, 開發(fā)環(huán)境完成后, 支持自動構建, 自動刷新, sass語法 等功能...感興趣的小伙伴們可以參考一下2018-07-07
詳解React setState數(shù)據(jù)更新機制
這篇文章主要介紹了React setState數(shù)據(jù)更新機制的相關資料,幫助大家更好的理解和學習使用React框架,感興趣的朋友可以了解下2021-04-04

