我的组件里面有Switch组件。整个组件是可点击的。当您单击此组件时,它会触发dispatch(修改redux store)并导致重新呈现此组件。 我需要的是不重新渲染整个组件,只是为了将Switch组件设置为正确的状态。
像这样的东西
<TouchableOpacity onPress={onPress}>
<Text>{this.props.title}</Text>
<Switch value={this.state.active}/>
</TouchableOpacity>
有什么想法吗?
我发现这个非常常见的用例,我知道我会遇到很多类似的情况,所以我需要这种行为,但我找不到任何网络上的示例或解决方案。也许我只是错过了一些东西。
由于
---编辑---
我也尝试过这个。我尝试使用shouldComponentUpdate禁用更新,我尝试仅在willRecieveProps中设置状态和/或切换,即使没有切换。我也试过玩LayoutAnimation。但没有任何作用。 this.setState()只是不为Switch组件设置动画。 我也尝试过使用this._switch._rctSwitch.setNativeProps({value:nextProps.active}),但这也不起作用(因为_rctSwitch而闻起来)。
class ViewWithSwitchInside extends React.Component {
constructor(props) {
super(props)
this.toggle = this.toggle.bind(this);
this.state = {
active: props.active
}
}
componentWillReceiveProps(nextProps) {
if (this.state.active != nextProps.active) {
this.setState({ active: nextProps.active })
}
}
toggle() {
let newValue = !this.state.active
this.setState({
active: newValue,
})
if (typeof this.props.onClick === 'function') {
this.props.onClick(newValue)
}
}
render() {
return (
<TouchableWithoutFeedback onPress={this.toggle}>
<View>
<Text>{this.props.title}</Text>
<Switch value={this.state.active} />
</View>
</TouchableWithoutFeedback>
)
}
}
答案 0 :(得分:0)
您不能只从父组件中渲染一个孩子。即使你以某种方式能够改变Switch所依赖的变量值,它也不会显示,除非你重新渲染父组件。
我尝试使用全局变量来设置切换器的值,我也阻止使用shouldComponentUpdate()
重新呈现父组件,您可以在here上阅读更多内容
这是我的结果:
这是我的应用的初始状态。该全局变量设置为false,父组件已经呈现。
现在我点击View
周围的Switch
并将其更改
但是视觉上没有任何变化,只有变量发生了变化,而不是切换器。
然后我按下&#34;重新渲染&#34;更改state
(对Switch
组件无关的更改)屏幕底部的文字发生了这种情况:
这是以上应用的代码:
var isActive = false; //global variable
class Test extends Component {
constructor(props) {
super(props);
this.state={active:false, irrelevantState: true};
}
test(foo){
console.log("Attempting to change", foo);
isActive = foo;
}
shouldComponentUpdate(nextProps, nextState){
if(this.state.active != nextState.active){//If the new state is different than the previous, stop rendering.
this.test(nextState.active);
return false;
}else { //else, re-render everything
return true;
}
}
render(){
console.log("Test re-render");
return(
<View style={{flex:1}}>
<TouchableOpacity onPress={()=>{this.setState({active:!this.state.active})}} style={{flex:1, marginTop:20}}>
<Text>Test Component</Text>
<Switch value={isActive}/>
</TouchableOpacity>
<TouchableOpacity onPress={()=>{this.setState({active:true})}} style={{flex:1, marginTop:20}}>
<Text>Test Component</Text>
<Switch value={isActive}/>
</TouchableOpacity>
<TouchableOpacity style={{height:20}} onPress={()=>this.setState({irrelevantState:false})}>
<Text> Re-render</Text>
</TouchableOpacity>
</View>
)
}
}
最好的办法是找到一种智能的方式,只有当this.state.active
和其他所需的状态让您的应用更改功能时才会重新呈现,而忽略其他更改。