2016-06-29 40 views
0

我有這應該設置父狀態,因此引發的onUpdate到子組件的輔助功能:Object.create有什麼替代方法(將狀態設置爲React組件時)?

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的整個對象原型。

如果我修改了代碼,這樣,該狀態變量以下

state = { fields: formFields }; 

的情況下轉身。我在父組件中得到正確的狀態,但是子組件更新沒有被觸發。

我有什麼替代方法使用Object.create()?這是爲什麼發生?

我還想補充一點,我知道這個問題的標題很傻,這真的讓我失去了知覺。

回答

2

不完全確定setFormStateformFields是什麼樣子,但幾乎可以肯定地避免在這裏使用原型。

例如,您可以用Object.assign合併所有的屬性:

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

這將創建一個擁有所有來自formFieldsform屬性的新fields對象。

+0

這解決了它。我確信我在使用對象引用到原始狀態時做錯了什麼,但仍然不知道setState()/ update子句行爲背後的確切推理。 –

+0

Object.assign行爲仍然存在一些混淆。你可以看看這個:http://pastebin.com/ifcA7w4J?我將formFields對象發送給此函數,並根據我如何使用Object.assign來修改調用函數中的原始對象。 –

+1

第一個在L4上創建'formFields'的淺拷貝,這意味着嵌套對象仍然是引用,並且你在L5-6上對它們進行變異。第二個用'field'對象替換'inputName'上的嵌套對象。 –

相關問題