【发布时间】:2020-01-16 20:48:04
【问题描述】:
我有一个由几个输入组件组成的表单。表单数据通过 React 上下文和 React 钩子 useContext 在这些兄弟组件之间共享和共享。
我对如何选择性地将数据异步加载到同一上下文中感到困惑。例如,如果浏览器 URL 是 example.com/form,那么表单可以使用 FormContext 提供的默认值加载(没问题)。但是,如果用户通过导航到example.com/form/:username/:form-id 返回以完成先前编辑的表单,则应用程序应使用这两个数据点获取数据。大概这必须以某种方式在 FormContext 中发生,以便覆盖默认的空表单初始值。
-
React.createContext函数是否可以使用 url 参数? - 如果是这样,当hooks are not to be used with in a conditional时如何处理可选的数据获取要求?
- 如何保证数据只取一次?
- 最后,表单还将当前状态保存到本地存储,以便在刷新时保持值。如果实现了数据获取,刷新应该加载异步数据还是本地存储?我倾向于本地存储,因为这更有可能代表用户上次体验的内容。我对实施的意见和想法持开放态度。
表单上下文
export const FormContext = React.createContext();
export const FormProvider = props => {
const defaultFormValues = {
firstName: "",
lastName: "",
whatever: "",
};
const [form, setForm] = useLocalStorage(
"form",
defaultFormValues
);
return (
<FormContext.Provider value={{ form, setForm }}>
{props.children}
</FormContext.Provider>
);
};
Reference 为useLocalStorage
【问题讨论】:
-
如果您使用 React Router,您可以通过
match属性获取查询参数。这是demo。然后,您可以使用参数来获取您需要的任何数据,将其存储在您的状态中,并有条件地将其传递给您的 Provider 的value属性。为了防止重新获取,您可以使用某种形式的 usePrevious 功能,仅在数据发生更改时才获取(希望他们使用钩子使这更容易)。
标签: reactjs react-hooks