Mhd*_*Mhd 8 reactjs react-redux
我有一个父组件,它是一个表单,它通过redux连接到商店:
// FormComponent
export default connect(mapStateToProps, mapDispatchToProps)(FormComponent);
Run Code Online (Sandbox Code Playgroud)
在该表单中,我有一个输入属性列表,它是表单的子组件:
我需要通过在输入失去焦点时传递包含所有属性的JSON对象来进行更新API调用,从而将任何字段中的更改保存到服务器.
API调用将是这样的:
updatePersonInfo({firstname: 'new name', lastname: 'new name', address: 'new address' });
Run Code Online (Sandbox Code Playgroud)
我的想法是将PersonInfo
对象作为道具从Form组件传递给所有子组件.每个子组件将从PersonInfo
props 更新一个属性,并使用更新的PersonInfo
对象调度UPDATE_PERSONINFO操作.但要做到这一点,我还需要将所有子组件连接到存储:
// FirstNameComponent
export default connect(mapStateToProps, mapDispatchToProps(FirstNameComponent);
// LastNameComponent
export default connect(mapStateToProps, mapDispatchToProps)(LastNameComponent);
// AddressComponent
export default connect(mapStateToProps, mapDispatchToProps)(AddressComponent);
Run Code Online (Sandbox Code Playgroud)
但我认为我们应该避免因为性能原因而使用connect.另外,我不相信我需要4个连接器来调用一个动作.
什么是处理这种情况的最佳选择?
小智 0
我认为您可以使用 来store.subscribe(listener)
比较任何更改并调用 API 来保存数据。https://redux.js.org/api-reference/store#subscribe
我将其用于类似的功能,我将所有商店数据保存在浏览器的本地存储中。
这是我如何使用
import { loadState, saveState, loadLanguage } from "./common/localStorage";
class Main extends React.Component {
..........
store.subscribe(() => {
saveState(store.getState()); // Some DOM api calls.
});
..........
}
Run Code Online (Sandbox Code Playgroud)
我的 localStorage.js 文件
export const loadState = () => {
try {
const serializedState = localStorage.getItem('state');
if (serializedState === null) {
return undefined;
}
return JSON.parse(serializedState);
} catch (err) {
return undefined;
}
};
export const saveState = (state) => {
try {
const serializedState = JSON.stringify(state);
localStorage.setItem('state', serializedState);
} catch (err) {
// die
}
};
export const saveLanguage = (code) => {
try {
localStorage.setItem('languageCode', code);
} catch (err) {
// die
}
};
export const loadLanguage = () => {
try {
const languageCode = localStorage.getItem('languageCode');
if (languageCode === null) {
return "pt-br";
}
return languageCode;
} catch (err) {
return "pt-br";
}
};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3032 次 |
最近记录: |