使用自定义渲染器获取 Antd AutoComplete 中选定选项的值
Getting the value of a selected option in Antd AutoComplete with custom renderer
我有一个 Antd AutoComplete 控件,它使用自定义渲染器,非常类似于这个分叉沙箱中的渲染器:https://codesandbox.io/s/lookup-patterns-certain-category-antd4140-forked-c9cxi
为简单起见,我们假设呈现的项目如下所示:
const renderItem = ({ id, name }) => ({
value: id.toString(),
label: (
<div>
{name}
</div>
)
});
我的目标是获取 renderItem
实例的文本值 {name}
并在 parent 组件中使用它。
自动完成输入值链接到实际的 Input.Search 组件
<AutoComplete
value={displayedSearchValue}
dropdownClassName="certain-category-search-dropdown"
dropdownMatchSelectWidth={500}
onSelect={handleSelect}
style={{
width: 250
}}
options={options}
>
<Input.Search
size="large"
placeholder="input here"
onChange={(e) => setDisplayedSearchValue(e.target.value)}
/>
</AutoComplete>
这是有原因的,当您单击并 select 一个条目时,AntD 将显示该记录的 value
。在我的例子中,值必须是唯一标识符,或者我可以简单地使用标题。
现在,在平面列表中,我可以简单地提取 handleSelect 中的 selected 值并完成它:
const handleSelect = (value, option) => {
setDisplayedSearchValue(option.label)
}
这将解析 design-quirk,并且将显示标签而不是值。现在,使用我的嵌套和分组数据源,该项目实际上是一个组件,option.label 不再是一个字符串,而是一个反应组件,我必须向下钻取以获取实际值:
const handleSelect = (value, option) => {
setDisplayedSearchValue(option.label.props.children);
};
如果文本值之间有空格,children 变成一个数组,我必须 .join('')
,这增加了更多的复杂性。如果我更改标记并且 nest 在 dom 中更靠下,我将不得不对 parent select 或再次进行修改,这很容易出错,因为它将成为option.label.props.children.props.children.join('')
很快,如果客户希望搜索结果更加活跃
感觉我在基本层面上做错了什么,在这里做出反应,以实现我想要的。
所以问题是:当我从 parent 组件中单击它时,如何从 child 组件中获取特定的 属性?
所以实现它的最简单方法似乎是简单地向项目添加一个额外的 属性 name
。它会被 antd 忽略,但你仍然可以在 onSelect
处理程序中访问它:
const renderItem = ({ id, name }) => ({
name,
value: id.toString(),
label: (
<div>
{name}
</div>
),
});
然后在处理程序中:
const handleSelect = (value, option) => setDisplayedSearchValue(option.name);
我有一个 Antd AutoComplete 控件,它使用自定义渲染器,非常类似于这个分叉沙箱中的渲染器:https://codesandbox.io/s/lookup-patterns-certain-category-antd4140-forked-c9cxi
为简单起见,我们假设呈现的项目如下所示:
const renderItem = ({ id, name }) => ({
value: id.toString(),
label: (
<div>
{name}
</div>
)
});
我的目标是获取 renderItem
实例的文本值 {name}
并在 parent 组件中使用它。
自动完成输入值链接到实际的 Input.Search 组件
<AutoComplete
value={displayedSearchValue}
dropdownClassName="certain-category-search-dropdown"
dropdownMatchSelectWidth={500}
onSelect={handleSelect}
style={{
width: 250
}}
options={options}
>
<Input.Search
size="large"
placeholder="input here"
onChange={(e) => setDisplayedSearchValue(e.target.value)}
/>
</AutoComplete>
这是有原因的,当您单击并 select 一个条目时,AntD 将显示该记录的 value
。在我的例子中,值必须是唯一标识符,或者我可以简单地使用标题。
现在,在平面列表中,我可以简单地提取 handleSelect 中的 selected 值并完成它:
const handleSelect = (value, option) => { setDisplayedSearchValue(option.label) }
这将解析 design-quirk,并且将显示标签而不是值。现在,使用我的嵌套和分组数据源,该项目实际上是一个组件,option.label 不再是一个字符串,而是一个反应组件,我必须向下钻取以获取实际值:
const handleSelect = (value, option) => {
setDisplayedSearchValue(option.label.props.children);
};
如果文本值之间有空格,children 变成一个数组,我必须 .join('')
,这增加了更多的复杂性。如果我更改标记并且 nest 在 dom 中更靠下,我将不得不对 parent select 或再次进行修改,这很容易出错,因为它将成为option.label.props.children.props.children.join('')
很快,如果客户希望搜索结果更加活跃
感觉我在基本层面上做错了什么,在这里做出反应,以实现我想要的。 所以问题是:当我从 parent 组件中单击它时,如何从 child 组件中获取特定的 属性?
所以实现它的最简单方法似乎是简单地向项目添加一个额外的 属性 name
。它会被 antd 忽略,但你仍然可以在 onSelect
处理程序中访问它:
const renderItem = ({ id, name }) => ({
name,
value: id.toString(),
label: (
<div>
{name}
</div>
),
});
然后在处理程序中:
const handleSelect = (value, option) => setDisplayedSearchValue(option.name);