React-select multi select 在没有值 selected 时更新道具
React-select multi select update a prop when no value is selected
我正在使用 react-select 库来创建多 selection 菜单。当没有值 selected 时,我希望在 div 上使用特定的样式宽度,并且当用户从 select 下拉列表中开始 selecting 值时,我想要此宽度设置为空,以便 select 组件可以使用它自己的自动调整宽度功能。我有以下代码,但我无法同步更新宽度,因为它会在下一次渲染调用后更新。不确定如何使其立即更新为新宽度。我知道 setState 是异步的,但如果您在 setState 函数中使用回调,我想它会以新状态呈现。
...
constructor(props) {
super(props);
this.state = {
dropBoxWidth: { width: 130 },
selectLength: 1
}
}
.....
handleChange = selectedOption => {
if (this.state.selectLength > 0) {
this.setState(
{ selectedOption, selectLength: selectedOption.length, dropBoxWidth: null },
() => console.log(`Option selected:`, this.state.selectedOption, this.state.selectLength, this.state.dropBoxWidth)
);
} else {
this.setState({ dropBoxWidth: { width: 130 }, selectLength: 1 }), () =>
console.log("New Dropbox Width ", this.state.dropBoxWidth)
}
};
render() {
return (
<div style={this.state.dropBoxWidth}>
<Select
closeMenuOnSelect={false}
isMulti
options={aList}
onChange={this.handleChange}
placeholder="Item Select"
/>
</div>
)
}
再次明确,我希望 div 的样式宽度在没有值 selected 时设置为 130。这可能是在页面打开或刷新时(构造函数属性的宽度为 130),如果用户 select 的值然后决定从菜单中清除所有 select 离子。
您可以在组件样式中使用初始状态。
<Select
options={options}
styles={{
container: (provided, state) => ({
...provided,
width: !state.hasValue && "130px",
borderBottom: "1px dotted pink"
})
}}
/>
点赞:https://codesandbox.io/s/amazing-dawn-xwcld?file=/src/App.js:290-517
React select 样式文档:https://react-select.com/styles
您的 console.log
没有打印您期望的保管箱宽度的原因是它实际上没有作为回调传递。
如果稍微格式化一下 setState
调用,您会注意到逗号实际上在右括号之后:
this.setState({
dropBoxWidth: { width: 130 },
selectLength: 1
}),
() => console.log("New Dropbox Width ", this.state.dropBoxWidth);
但是代码的问题是您在进行 this.state.selectLength
比较时使用的是陈旧数据。您真正感兴趣的不是以前的值,而是当前的值。 react-select
传递给您的 selectedOption
参数要么是一个数组,要么是 null,因此您可以直接从那里检查长度(即,您可以 [=18= 而不是 this.state.selectLength > 0
]).
但是,既然您提到您对样式和长度感兴趣,因为您想要为父项设置样式 div,您实际上并不需要存储样式或长度 - 您可以存储所选选项并在 render()
:
中导出状态
const selectedStyle = { width: 130 }
class Selector extends React.Component {
constructor(props) {
super(props);
this.state = {
selectedOption: null,
};
}
handleChange = (selectedOption) => {
// null or object array
this.setState({ selectedOption });
};
render() {
const { selectedOption } = this.state;
const anythingSelected = selectedOption && selectedOption.length > 0;
return (
<div style={!anythingSelected ? selectedStyle : null}>
<Select
closeMenuOnSelect={false}
isMulti
options={aList}
onChange={this.handleChange}
placeholder="Item Select"
/>
</div>
);
}
}
我正在使用 react-select 库来创建多 selection 菜单。当没有值 selected 时,我希望在 div 上使用特定的样式宽度,并且当用户从 select 下拉列表中开始 selecting 值时,我想要此宽度设置为空,以便 select 组件可以使用它自己的自动调整宽度功能。我有以下代码,但我无法同步更新宽度,因为它会在下一次渲染调用后更新。不确定如何使其立即更新为新宽度。我知道 setState 是异步的,但如果您在 setState 函数中使用回调,我想它会以新状态呈现。
...
constructor(props) {
super(props);
this.state = {
dropBoxWidth: { width: 130 },
selectLength: 1
}
}
.....
handleChange = selectedOption => {
if (this.state.selectLength > 0) {
this.setState(
{ selectedOption, selectLength: selectedOption.length, dropBoxWidth: null },
() => console.log(`Option selected:`, this.state.selectedOption, this.state.selectLength, this.state.dropBoxWidth)
);
} else {
this.setState({ dropBoxWidth: { width: 130 }, selectLength: 1 }), () =>
console.log("New Dropbox Width ", this.state.dropBoxWidth)
}
};
render() {
return (
<div style={this.state.dropBoxWidth}>
<Select
closeMenuOnSelect={false}
isMulti
options={aList}
onChange={this.handleChange}
placeholder="Item Select"
/>
</div>
)
}
再次明确,我希望 div 的样式宽度在没有值 selected 时设置为 130。这可能是在页面打开或刷新时(构造函数属性的宽度为 130),如果用户 select 的值然后决定从菜单中清除所有 select 离子。
您可以在组件样式中使用初始状态。
<Select
options={options}
styles={{
container: (provided, state) => ({
...provided,
width: !state.hasValue && "130px",
borderBottom: "1px dotted pink"
})
}}
/>
点赞:https://codesandbox.io/s/amazing-dawn-xwcld?file=/src/App.js:290-517
React select 样式文档:https://react-select.com/styles
您的 console.log
没有打印您期望的保管箱宽度的原因是它实际上没有作为回调传递。
如果稍微格式化一下 setState
调用,您会注意到逗号实际上在右括号之后:
this.setState({
dropBoxWidth: { width: 130 },
selectLength: 1
}),
() => console.log("New Dropbox Width ", this.state.dropBoxWidth);
但是代码的问题是您在进行 this.state.selectLength
比较时使用的是陈旧数据。您真正感兴趣的不是以前的值,而是当前的值。 react-select
传递给您的 selectedOption
参数要么是一个数组,要么是 null,因此您可以直接从那里检查长度(即,您可以 [=18= 而不是 this.state.selectLength > 0
]).
但是,既然您提到您对样式和长度感兴趣,因为您想要为父项设置样式 div,您实际上并不需要存储样式或长度 - 您可以存储所选选项并在 render()
:
const selectedStyle = { width: 130 }
class Selector extends React.Component {
constructor(props) {
super(props);
this.state = {
selectedOption: null,
};
}
handleChange = (selectedOption) => {
// null or object array
this.setState({ selectedOption });
};
render() {
const { selectedOption } = this.state;
const anythingSelected = selectedOption && selectedOption.length > 0;
return (
<div style={!anythingSelected ? selectedStyle : null}>
<Select
closeMenuOnSelect={false}
isMulti
options={aList}
onChange={this.handleChange}
placeholder="Item Select"
/>
</div>
);
}
}