我不知道你的应用程序逻辑是如何工作的,因为你没有分享它,但是你可以使用shouldComponentUpdate() 来解决这个问题。
如果 shouldComponentUpdate 返回false,则render() 将被完全跳过,直到下一次状态更改。另外,不会调用componentWillUpdate和componentDidUpdate。
所以你可以这样做:
shouldComponentUpdate(nextProps) {
if(typeof nextProps.value === 'undefined') return false; //return false if value is undefined
return true; //otherwise always return true (this is default)
}
如果value 未定义,这将防止组件重新渲染。虽然我建议改为发送null,因为该变量实际上已定义,但根本没有任何价值。
请注意,这不会按照您的要求禁用滑块 - 它只会保持滑块的原始渲染状态。
如果您还想在选中复选框时禁用滑块,我认为这里有几个选项。这是一个:
将组件拆分成2个子组件
这里的想法是道具直接控制滑块和复选框,而不使用state。如果您想使用 Stateless Functional Components,这很好,请查看我的指南,了解如何以及为什么使用它。
所以你的代码应该是这样的:
复选框滑块:
class CheckboxSlider extends React.Component {
constructor(props, context) {
super(props, context);
this.state = {
value: 50, //default is in the middle, 50%
disabled: false
};
}
_toggleSlider = () => {
this.setState({disabled: !this.state.disabled});
}
render() {
<div>
<Slider value={this.state.value} disabled={this.state.disabled} />
<CheckBox onCheckboxChange={this._toggleSlider} />
</div>
}
}
export default CheckboxSlider;
滑块:
import React from 'react';
const Slider = (props) => (
<input id="slider" type="range" min="0" max="100" disabled={props.disabled} />
);
export default Slider;
复选框:
import React from 'react';
const Checkbox = (props) => (
<input id="checkbox" type="checkbox" onChange={props.onCheckboxChange} />
);
export default Checkbox;