Mat*_*hew 7 javascript reactjs
假设我有三个元素保持状态计数器,点击时递增.
如果单击一个元素,如何将其他计数器重置为0?
https://jsfiddle.net/69z2wepo/56827
const Parent = React.createClass({
render() {
const rows = [];
for (let i = 0; i < 3; i++) {
rows.push(<Child key={i} />);
}
return (
<ul>
{rows}
</ul>
);
}
});
const Child = React.createClass({
getInitialState() {
return {counter: 0};
},
handleClick() {
this.setState({counter: ++this.state.counter });
},
render() {
return (
<div onClick={this.handleClick}>
{this.state.counter}
</div>
);
}
});
ReactDOM.render(
<Parent />,
document.getElementById('app')
);
Run Code Online (Sandbox Code Playgroud)
tlr*_*son 18
如果您真的无法像其他答案所建议的那样将状态提升到父组件中,那么一种hacky 的方法就是更改key元素的道具。这会导致 React 卸载旧元素key并安装新实例。
class ChildComponent extends React.Component {
state = {
count: 0
};
render() {
const { count } = this.state;
return (
<div>
<div>count: {count}</div>
<button onClick={() => this.setState({ count: count + 1 })}>Increment</button>
</div>
);
}
}
class ParentComponent extends React.Component {
state = {
stateBustingKey: 0
};
render() {
const { stateBustingKey } = this.state;
return (
<div>
<ChildComponent key={stateBustingKey} />
<button
onClick={() =>
this.setState({ stateBustingKey: stateBustingKey + 1 })
}
>
Reset
</button>
</div>
);
}
}
ReactDOM.render(<ParentComponent />, document.getElementById("root"));Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root" />Run Code Online (Sandbox Code Playgroud)
这会有点困难,因为您的Child组件正在管理自己的状态。
您可以将它们转换为哑组件并在组件中管理它们的状态Parent。
像这样的东西
const Parent = React.createClass({
getInitialState() {
return {counters: [0,0,0]};
},
handleClick(index){
let newCounterState = this.state.counters.map(() => 0);
newCounterState[index] = this.state.counters[index] + 1 ;
this.setState({counters : newCounterState})
},
render() {
const rows = this.state.counters.map((value,index) => (
<Child
key={index}
handleClick={() => this.handleClick(index)}
counter={value}
/>
))
return (
<ul>
{rows}
</ul>
);
}
});
const Child = ({counter,handleClick}) => (
<div onClick={handleClick}>
{counter}
</div>
)
ReactDOM.render(
<Parent />,
document.getElementById('app')
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4203 次 |
| 最近记录: |