2016-04-28 2 views
5

Я использую состояние реакции (v0.14), чтобы удерживать пары значений значений несохраненных идентификаторов и пользовательских объектов. Например:Правильный способ удаления ключа из состояния реакции

onChange = (user, field) => { 
    return (event) => { 
    let newUser = _.clone(this.state[user.uuid] || user); 
    _.assign(newUser, {[field]: event.target.value}); 
    this.setState({ 
     [user.uuid]: newUser 
    }); 
    } 
} 

render() { 
    let usersJsx = users.map((user, i) => { 
    return <div key={i}> 
     <input type="text" value={user.name} 
     onChange={this.onChange(user, 'name')}/> 
    </div>; 
    }); 

    let numberUnsavedUsers = _.keys(this.state).length; 

    // ... etc 
} 

Это все работает отлично, пока я не пришел к методу сохранения:

persistUsers = (event) => { 

    let unsavedUsers = _.toArray(this.state); 
    updateUsers(unsavedUsers, { 
    onSuccessCb: (savedUsers) => { 

     // Would prefer to remove these two lines and replace 
     // with `this.setState({});` but this doesn't work... i.e. 
     // the state is left untouched rather than being 
     // replaced with `{}`. This makes sense. I guess I was hoping 
     // someone might point me towards a this.replaceState() 
     // alternative. 
     this.setState({nothing: true}); // triggers a state change event. 
     this.state = {}; // wipes out the state. 
    }  
    }); 
} 

Я искал вокруг, но только нашли людей, изменяющих вложенные объекты или массивы и ключевые значения не верхнего уровня.

+1

Yeah @zerkms Я думаю, что единственным способом обойти это было бы поместить всех несохраненных пользователей в объект в состоянии, например: 'this.state = {unsavedUsers: {}};' Этот способ, вызывающий это. setState ({unsavedUsers: {}}) должен работать. – AJP

+0

вы не сможете называть 'this.state = {something}' в будущем, он будет бросать. –

ответ

5

Вы должны использовать replaceState вместо setState

Update:replaceState is being deprecated. Вы должны следовать рекомендации и использовать setState с нулевыми значениями.

Рекомендация:

Вы должны имя данные и использовать setState, так что вы можете легко работать с ним.

вместо:

//bad 
this.setState({ 
    [user.uuid]: newUser 
}); 

использование:

//good 
this.setState({ 
newUser: {uuid: user.uuid} 
}) 

Если ваше состояние было {unsavedUsers: {userData}} вместо {userData} тогда вы могли бы легко setState({unsavedUsers: {}}) без введения replaceState.

replaceState - это анти-шаблон, потому что он используется редко.

Оригинал Ответ:

Как setState() но удаляет любые уже существующие государственные ключи, а не в объекте NewState.

Documentation

this.replaceState({}) будут удалены все объекты.

+0

«Вы должны назвать данные в своем состоянии, чтобы вы могли более легко с ним работать» - это также анти-шаблон. Поскольку его цель заключается в том, чтобы обойти «ограничения» инструмента, вместо того, чтобы проектировать в соответствии с моделью домена. – zerkms

+0

@zerkms нет, вы ошибаетесь. –

+0

Да, должно быть, сказал, что я использую классы ES6 в TypeScript, поэтому replaceState недоступен для меня. Кроме того, уведомление об отступлении от него меня отпустило. Спасибо, что подтвердили мою догадку, используя объект состояния. – AJP

Смежные вопросы