我正在使用可以找到的here反应日期选择器组件。除了看似疏忽之外,该组件非常棒:它没有实现willReceiveProps
。
为了解释,我创建了如下数据选择器:
<DateField
dateFormat= { dateFormat}
forceValidDate={true}
defaultValue={startDate || ''}
onChange={this.handleChange.bind(null, 'start_date')}
id="start"
>
<DatePicker
navigation={true}
locale="en"
forceValidDate={true}
highlightWeekends={true}
highlightToday={true}
weekNumbers={true}
weekStartDay={0}
/>
</DateField>
请注意,我传递defaultValue
的道具startDate
。现在,startDate
可以并且确实因组件外部的原因而发生变化。该值在通常的新render()
操作期间传递。根据反应哲学,这应该不是问题。
但是,在我看来,defaultValue
中的值只能在DateField
内读取一次。它被读作this.props.defaultValue
。任何曾经构建过依赖道具的组件的人都应该很快意识到这是一个问题。这意味着当改变道具时,将不使用新值。
因为这是一个库,所以我不能简单地实现willReceiveProps
。有没有人知道一个好的解决方法是让这个组件完全重置render
或其他一些策略来处理看似很大的设计问题?
答案 0 :(得分:2)
它们遵循与/Users/myuser/Library/Developer/Xcode/DerivedData/myproject-hash/Build/Products/Release/Alamofire.framework/Modules/Alamofire.swiftmodule/x86_64.swiftmodule
组件相同的标准。 <input>
只读一次,但也可以在外部设置defaultValue
。他们无需使用value
。
简而言之,请使用willReceiveProps
代替value
。
请参阅Uncontrolled Components in React
PS:我正在查看代码,似乎除了defaultValue
之外还有属性text
和date
。由于代码(和文档)已从github中删除,我不会检查这些道具之间的区别。