[英]Subscribe to action in one React component published from another
想象一下以下情況:我們開發了兩個智能組件並發布了兩個 npm 封裝。 之后,我們將組件導入另一個團隊開發的第三個 React 應用程序。
package.json
"dependencies": {
"component-ui1": "0.1.1",
"component-ui2": "0.1.0"
}
應用程序.jsx
import React, { useEffect } from 'react';
import ComponentUI1 from 'component-ui1';
import ComponentUI2 from 'component-ui2';
export const App = () => {
useEffect(() => {
// Some asynchronous actions
}, []);
return (
<>
<ComponentUI1 someProp={true} />
<ComponentUI2 someProp={false} />
</>
);
};
如何通過 DOM 在ComponentUI1
中生成事件,以便觸發ComponentUI2
中的操作,例如更新某些列表? 最好不修改源組件的邏輯。
正確的做法是
使父容器進行更新
import React, { useEffect } from 'react'; import ComponentUI1 from 'component-ui1'; import ComponentUI2 from 'component-ui2'; export const App = () => { useEffect(() => { // Some asynchronous actions }, []); const [listAbc, setListAbc] = useState(0); const eventAbc = () = { //... update listAbc // setListAbc() } return ( <> <ComponentUI1 someProp={true} someEvent={eventAbc} /> <ComponentUI2 someProp={false} someList={listAbc} /> </> );
};
import React, { useState, useEffect } from 'react';
import ComponentUI1 from 'component-ui1';
import ComponentUI2 from 'component-ui2';
export const App = () => {
const [state, setState] = useState({ComponentUI1List: [], ComponentUI2List: []});
useEffect(() => {
// Some asynchronous actions
}, []);
return (
<>
<ComponentUI1 state={state} changeState={(data) => setState(data)} />
<ComponentUI2 state={state} changeState={(data) => setState(data)} />
</>
);
};
現在在您的 ComponentUI1 或 2 中,您可以像這樣更改ComponentUI1List
或ComponentUI2List
:
// ComponentUI1.jsx
import React from 'react';
export const App = (props) =>
(
<>
<div className="container">
<button onClick=(props.changeState({...props.state, ComponentUI2List: [{id: 1, title: "New Generated Data"}]}))
</div>
</>
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.