仅更新 1 个组件而不是 ReactJS 中的所有组件
Update only 1 component instead of all in ReactJS
在此代码中有 2 个下拉菜单。我也在尝试执行类似的功能。我的项目有 2 个下拉菜单,但当我更改值时,每个下拉菜单都应该有单独的值。如果我使用此代码,则两个下拉菜单的值相同。应该改变什么?
我是第一次做 React,所以我连基础知识都不知道。
import React from 'react';
import DropDownMenu from 'material-ui/DropDownMenu';
import MenuItem from 'material-ui/MenuItem';
const styles = {
customWidth: {
width: 200,
},
};
export default class DropDownMenuSimpleExample extends React.Component {
constructor(props) {
super(props);
this.state = {value: 1};
}
handleChange = (event, index, value) => this.setState({value});
render() {
return (
<div>
<DropDownMenu value={this.state.value} onChange={this.handleChange}>
<MenuItem value={1} primaryText="Never" />
<MenuItem value={2} primaryText="Every Night" />
<MenuItem value={3} primaryText="Weeknights" />
<MenuItem value={4} primaryText="Weekends" />
<MenuItem value={5} primaryText="Weekly" />
</DropDownMenu>
<br />
<DropDownMenu
value={this.state.value}
onChange={this.handleChange}
style={styles.customWidth}
autoWidth={false}
>
<MenuItem value={1} primaryText="Custom width" />
<MenuItem value={2} primaryText="Every Night" />
<MenuItem value={3} primaryText="Weeknights" />
<MenuItem value={4} primaryText="Weekends" />
<MenuItem value={5} primaryText="Weekly" />
</DropDownMenu>
</div>
);
}
}
class SomeComponent extends React.Component {
constructor(props) {
this.state = {
dropdownA: "someValue",
dropdownB: "someOtherValue"
}
}
handleChange = (which, event) => {
this.setState({ [which]: event.target.value })
}
render() {
return (
<div>
<DropDownMenu
value={this.state.dropdownA}
onChange={this.handleChange.bind(null, 'dropdownB')}
>
<MenuItem value={1} primaryText="Never" />
<MenuItem value={2} primaryText="Every Night" />
<MenuItem value={3} primaryText="Weeknights" />
<MenuItem value={4} primaryText="Weekends" />
<MenuItem value={5} primaryText="Weekly" />
</DropDownMenu>
<br />
<DropDownMenu
value={this.state.dropdownB}
onChange={this.handleChange.bind(null, 'dropdownB')}
style={styles.customWidth}
autoWidth={false}
>
<MenuItem value={1} primaryText="Custom width" />
<MenuItem value={2} primaryText="Every Night" />
<MenuItem value={3} primaryText="Weeknights" />
<MenuItem value={4} primaryText="Weekends" />
<MenuItem value={5} primaryText="Weekly" />
</DropDownMenu>
</div>
)
}
}
特别是,我更新了每个 DropDownMenu
以使用父组件状态中它们自己的字段:第一个 dropdownA
,第二个 dropdownB
。为了解决这个问题,我调整了每个 onChange
回调,partially applying 回调带有它应该更新的字段名称。
您可以只为单独的 DropDownMenu
个实例定义单独的处理程序
import React from 'react';
import DropDownMenu from 'material-ui/DropDownMenu';
import MenuItem from 'material-ui/MenuItem';
const styles = {
customWidth: {
width: 200,
},
};
export default class DropDownMenuSimpleExample extends React.Component {
constructor(props) {
super(props);
this.state = {value: 1};
}
handleValue1Change = (event, index, value1) => this.setState({value1});
handleValue2Change = (event, index, value2) => this.setState({value2});
render() {
return (
<div>
<DropDownMenu value={this.state.value1} onChange={this.handleValue1Change}>
<MenuItem value={1} primaryText="Never" />
<MenuItem value={2} primaryText="Every Night" />
<MenuItem value={3} primaryText="Weeknights" />
<MenuItem value={4} primaryText="Weekends" />
<MenuItem value={5} primaryText="Weekly" />
</DropDownMenu>
<br />
<DropDownMenu
value={this.state.value2}
onChange={this.handleValue2Change}
style={styles.customWidth}
autoWidth={false}
>
<MenuItem value={1} primaryText="Custom width" />
<MenuItem value={2} primaryText="Every Night" />
<MenuItem value={3} primaryText="Weeknights" />
<MenuItem value={4} primaryText="Weekends" />
<MenuItem value={5} primaryText="Weekly" />
</DropDownMenu>
</div>
);
}
}
在此代码中有 2 个下拉菜单。我也在尝试执行类似的功能。我的项目有 2 个下拉菜单,但当我更改值时,每个下拉菜单都应该有单独的值。如果我使用此代码,则两个下拉菜单的值相同。应该改变什么?
我是第一次做 React,所以我连基础知识都不知道。
import React from 'react';
import DropDownMenu from 'material-ui/DropDownMenu';
import MenuItem from 'material-ui/MenuItem';
const styles = {
customWidth: {
width: 200,
},
};
export default class DropDownMenuSimpleExample extends React.Component {
constructor(props) {
super(props);
this.state = {value: 1};
}
handleChange = (event, index, value) => this.setState({value});
render() {
return (
<div>
<DropDownMenu value={this.state.value} onChange={this.handleChange}>
<MenuItem value={1} primaryText="Never" />
<MenuItem value={2} primaryText="Every Night" />
<MenuItem value={3} primaryText="Weeknights" />
<MenuItem value={4} primaryText="Weekends" />
<MenuItem value={5} primaryText="Weekly" />
</DropDownMenu>
<br />
<DropDownMenu
value={this.state.value}
onChange={this.handleChange}
style={styles.customWidth}
autoWidth={false}
>
<MenuItem value={1} primaryText="Custom width" />
<MenuItem value={2} primaryText="Every Night" />
<MenuItem value={3} primaryText="Weeknights" />
<MenuItem value={4} primaryText="Weekends" />
<MenuItem value={5} primaryText="Weekly" />
</DropDownMenu>
</div>
);
}
}
class SomeComponent extends React.Component {
constructor(props) {
this.state = {
dropdownA: "someValue",
dropdownB: "someOtherValue"
}
}
handleChange = (which, event) => {
this.setState({ [which]: event.target.value })
}
render() {
return (
<div>
<DropDownMenu
value={this.state.dropdownA}
onChange={this.handleChange.bind(null, 'dropdownB')}
>
<MenuItem value={1} primaryText="Never" />
<MenuItem value={2} primaryText="Every Night" />
<MenuItem value={3} primaryText="Weeknights" />
<MenuItem value={4} primaryText="Weekends" />
<MenuItem value={5} primaryText="Weekly" />
</DropDownMenu>
<br />
<DropDownMenu
value={this.state.dropdownB}
onChange={this.handleChange.bind(null, 'dropdownB')}
style={styles.customWidth}
autoWidth={false}
>
<MenuItem value={1} primaryText="Custom width" />
<MenuItem value={2} primaryText="Every Night" />
<MenuItem value={3} primaryText="Weeknights" />
<MenuItem value={4} primaryText="Weekends" />
<MenuItem value={5} primaryText="Weekly" />
</DropDownMenu>
</div>
)
}
}
特别是,我更新了每个 DropDownMenu
以使用父组件状态中它们自己的字段:第一个 dropdownA
,第二个 dropdownB
。为了解决这个问题,我调整了每个 onChange
回调,partially applying 回调带有它应该更新的字段名称。
您可以只为单独的 DropDownMenu
个实例定义单独的处理程序
import React from 'react';
import DropDownMenu from 'material-ui/DropDownMenu';
import MenuItem from 'material-ui/MenuItem';
const styles = {
customWidth: {
width: 200,
},
};
export default class DropDownMenuSimpleExample extends React.Component {
constructor(props) {
super(props);
this.state = {value: 1};
}
handleValue1Change = (event, index, value1) => this.setState({value1});
handleValue2Change = (event, index, value2) => this.setState({value2});
render() {
return (
<div>
<DropDownMenu value={this.state.value1} onChange={this.handleValue1Change}>
<MenuItem value={1} primaryText="Never" />
<MenuItem value={2} primaryText="Every Night" />
<MenuItem value={3} primaryText="Weeknights" />
<MenuItem value={4} primaryText="Weekends" />
<MenuItem value={5} primaryText="Weekly" />
</DropDownMenu>
<br />
<DropDownMenu
value={this.state.value2}
onChange={this.handleValue2Change}
style={styles.customWidth}
autoWidth={false}
>
<MenuItem value={1} primaryText="Custom width" />
<MenuItem value={2} primaryText="Every Night" />
<MenuItem value={3} primaryText="Weeknights" />
<MenuItem value={4} primaryText="Weekends" />
<MenuItem value={5} primaryText="Weekly" />
</DropDownMenu>
</div>
);
}
}