javascript - Object.create 有哪些替代方案(将状态设置为 React 组件时)?

标签 javascript reactjs

我有一个辅助函数,它应该为父组件设置状态,从而触发子组件的 onUpdate:

validateInput: function (inputValue, inputName, inputRules, setFormState, formFields) {
    let hasError = false;
    let errorText = false;
    if (!inputValue && inputRules.required) {
        hasError = true;
        errorText = 'This field is required.';
    }
    else {
        hasError = false;
        errorText = false;
    };
    state = { fields: Object.create(formFields) };
    state.fields[inputName].hasError = hasError;
    state.fields[inputName].errorText = errorText;

    return setFormState(state);
}

这给了我想要的效果并且子组件更新。但是如果我在父组件中记录状态,我会得到空对象。当我登录时,这些值是在 proto 下找到的,我实际上并没有完全理解 JavaScript 的整个对象原型(prototype)。

如果我修改代码,则状态变量如下

state = { fields: formFields };

情况出现逆转。我在父组件中获得了正确的状态,但未触发子组件更新。

使用 Object.create() 有哪些替代方案?为什么会发生这种情况?

我还想补充一点,我知道这个问题的标题很愚蠢,这真的让我迷失了方向。

最佳答案

不太确定 setFormStateformFields 是什么样子,但您几乎可以肯定避免在此处使用原型(prototype)。

例如,您可以使用 Object.assign 合并所有属性:

let form = { hasError, errorText };
let fields = Object.assign({}, formFields, form);
let state = { fields };
return setFormState(state);

这将创建一个新的 fields 对象,该对象具有 formFieldsform 的所有属性。

关于javascript - Object.create 有哪些替代方案(将状态设置为 React 组件时)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38106642/

相关文章:

javascript - 编译模板时的代码味道

javascript - Object.map lambda 代码可以在 Chrome、Firefox 中运行,但不能在 IE 中运行?

reactjs - 检查子进程是否是 React.Fragment

css - JSX 中的 SVG - 如何转换 defs 标签

reactjs - 将 React props 与自定义 props 连接起来

css - 旋转木马样式组件上的 React-spring useTransition 在过渡期间导致重叠

javascript - 测试 setTimeout 函数之前 Mocha 等待

javascript - 如何在 raphaeljs 中使用 attr 的 stroke-dasharray,stroke-linecap,stroke-linejoin

javascript - 如何使用 javascript 按钮将 mathjax 方程添加到 html 页面中

javascript - 使用内联样式添加悬停效果以响应 div