react select 加载异步选项不加载
react select load async options does not load
我想从后端加载选项。所以我必须从 API 获取数据,然后更新选项。
但我不知道该怎么做。有人可以帮忙吗?这是我的代码:
function myComponent() {
const loadOptions = () => {
console.log('on load options function')
axios.get(`/api/admin/roles`)
.then((response) => {
const options = []
response.data.permissions.forEach((permission) => {
options.push({
label: permission.name,
value: permission.id
})
})
return options
})
}
return (
<AsyncSelect
isMulti
cacheOptions
loadOptions={loadOptions}
/>
)
}
顺便说一句,根本没有任何记录,这意味着 loadOptions 函数不会 运行。这是我来自 API 的回复:
response: {
data: {
permissions: [{
id: 13,
name: 'deposit'
}, {
id: 14,
name: 'withdraw'
}]
}
}
AsyncSelect expects a defaultOptions prop,您还没有提供。文档不清楚在这种情况下它应该表现出什么行为,但我猜它默认加载过滤器。
您的loadOptions
函数必须return一个承诺。您也可以将 defaultOptions
传递为 true 以使请求触发初始选项集
const loadOptions = () => {
console.log('on load options function')
return axios.get(`/api/admin/roles`)
.then((response) => {
const options = []
response.data.permissions.forEach((permission) => {
options.push({
label: permission.name,
value: permission.id
})
})
return options
})
}
function myComponent() {
return (
<AsyncSelect
isMulti
cacheOptions
defaultOptions
loadOptions={loadOptions}
/>
)
}
P.S 出于性能原因,您可以在组件外部声明 loadOptions 函数,这样它就不会在每次重新渲染时都重新创建
试试这个
const loadOptions = async () => {
const response = await axios.get(`/api/admin/roles`)
const result = await response.data
return await result.permissions.map((permission) => ({
label: permission.name,
value: permission.id
}))
}
您遇到的问题似乎是因为您没有在 loadOptions
函数的顶层返回任何内容。
documentation 重点介绍了两种定义 loadOptions
函数的方法。
使用回调:
const loadOptions = (inputValue, callback) => {
setTimeout(() => {
callback(options);
}, 1000);
};
使用承诺:
const loadOptions = inputValue =>
new Promise(resolve => {
setTimeout(() => {
resolve(options);
}, 1000);
});
在您的情况下,首先尝试回调选项可能最简单,因为您现有的语法有利于它。
const loadOptions = (inputValue, callback) => {
console.log('on load options function')
axios.get(`/api/admin/roles`)
.then((response) => {
const options = []
response.data.permissions.forEach((permission) => {
options.push({
label: permission.name,
value: permission.id
})
})
callback(options);
})
}
将来您可以选择利用 inputValues
参数向下过滤结果。
我想从后端加载选项。所以我必须从 API 获取数据,然后更新选项。 但我不知道该怎么做。有人可以帮忙吗?这是我的代码:
function myComponent() {
const loadOptions = () => {
console.log('on load options function')
axios.get(`/api/admin/roles`)
.then((response) => {
const options = []
response.data.permissions.forEach((permission) => {
options.push({
label: permission.name,
value: permission.id
})
})
return options
})
}
return (
<AsyncSelect
isMulti
cacheOptions
loadOptions={loadOptions}
/>
)
}
顺便说一句,根本没有任何记录,这意味着 loadOptions 函数不会 运行。这是我来自 API 的回复:
response: {
data: {
permissions: [{
id: 13,
name: 'deposit'
}, {
id: 14,
name: 'withdraw'
}]
}
}
AsyncSelect expects a defaultOptions prop,您还没有提供。文档不清楚在这种情况下它应该表现出什么行为,但我猜它默认加载过滤器。
您的loadOptions
函数必须return一个承诺。您也可以将 defaultOptions
传递为 true 以使请求触发初始选项集
const loadOptions = () => {
console.log('on load options function')
return axios.get(`/api/admin/roles`)
.then((response) => {
const options = []
response.data.permissions.forEach((permission) => {
options.push({
label: permission.name,
value: permission.id
})
})
return options
})
}
function myComponent() {
return (
<AsyncSelect
isMulti
cacheOptions
defaultOptions
loadOptions={loadOptions}
/>
)
}
P.S 出于性能原因,您可以在组件外部声明 loadOptions 函数,这样它就不会在每次重新渲染时都重新创建
试试这个
const loadOptions = async () => {
const response = await axios.get(`/api/admin/roles`)
const result = await response.data
return await result.permissions.map((permission) => ({
label: permission.name,
value: permission.id
}))
}
您遇到的问题似乎是因为您没有在 loadOptions
函数的顶层返回任何内容。
documentation 重点介绍了两种定义 loadOptions
函数的方法。
使用回调:
const loadOptions = (inputValue, callback) => {
setTimeout(() => {
callback(options);
}, 1000);
};
使用承诺:
const loadOptions = inputValue =>
new Promise(resolve => {
setTimeout(() => {
resolve(options);
}, 1000);
});
在您的情况下,首先尝试回调选项可能最简单,因为您现有的语法有利于它。
const loadOptions = (inputValue, callback) => {
console.log('on load options function')
axios.get(`/api/admin/roles`)
.then((response) => {
const options = []
response.data.permissions.forEach((permission) => {
options.push({
label: permission.name,
value: permission.id
})
})
callback(options);
})
}
将来您可以选择利用 inputValues
参数向下过滤结果。