英文:
react native: passing the value of selected items to a function
问题
我正在尝试实现一个来自react-native-dropdown-select-list
库的MultipleSelectList
,并将所选项目保存在@react-native-async-storage/async-storage
的AsyncStorage
中。我实现了2个useState
变量。首先是:
const [selected, setSelected] = useState([{}]);
这是一个包含{name: muscleGroup, value: id(s) of the exercise(s)}
的列表(这是保存在viewDataList
列表中的对象,见setExerciseViewLists
)。我还实现了另一个useState
变量:
const [selectedCount, setSelectedCount] = useState({
Back: 0,
Legs: 0,
Chest: 0,
// 其他...
});
我的想法是:当我从我的MultipleSelectList
中调用handleSelect
时,我会传递给它两个参数(val和item),val应该是运动的id(s),因为我在我的MultipleSelectList
中定义了它(见MultipleSelectList
),而item是来自viewDataList
的一个列表项。
问题是:出于某种原因,val不是ID或ID列表,它是一个匿名函数:
function (val) {
var temp = [].concat(val, [value]);
return temp;
}
(我不太理解这是什么)。任何帮助都将不胜感激。
MultipleSelectList
{viewDataList.map((item, index) => (
<MultipleSelectList
data={item.list.map(listItem => ({
value: listItem.id, // 这里
}))}
save="value"
setSelected={val => handleSelect(val, item)}
selected={selected.map(item => item.value)}
/>
))}
handleSelect/异步保存
const handleSelect = async (val, item) => {
setSelectedCount(prevState => ({
...prevState,
[item.name]: prevState[item.name] + 1, // item.name = muscleGroup
}));
setSelected(prevState => ([
...prevState,
{
name: item.name,
value: val // val应该是ID(s)
},
]));
try {
await AsyncStorage.setItem('selected', JSON.stringify([
...selected,
{
name: item.name,
value: val,
}
]));
await AsyncStorage.setItem('selectedCount', JSON.stringify({
...selectedCount,
[item.name]: selectedCount[item.name] + 1,
}));
} catch (e) {
console.e('Error saving data to AsyncStorage:', e);
}
};
setExerciseViewLists
const setExerciseViewLists = () => {
let list = [];
list.push(
{.....},
{
num: 3,
name: "muscleGroup",
list: [{.....}, { id: "123", exercises : "something" }, {.....}]
},
{.....},
);
setViewDataList(list);
};
英文:
I am trying to implement a MultipleSelectList
from this library react-native-dropdown-select-list
. And I am saving the selected items in the AsyncStorage
of @react-native-async-storage/async-storage
. I implemented 2 useState variables: first const [selected, setSelected] = useState([{}]);
this is a list of {name : muscleGroup, value : id(s) of the exercise(s)}
(this is the object that is saved in the list of viewDataList [see setExerciseViewLists ]). The other useState variable that I have implemented is:
const [selectedCount, setSelectedCount] = useState({ // a list of the number of selected exercises per muscleGroup
Back: 0,
Legs: 0,
Chest: 0,
.....
});
The idea: when I call handleSelect
(see handleSelect) from my MultipleSelectList
I give it 2 parameters (val and item) val should be the id(s) of the exercise(s) because I defined it as this in my MultipleSelectList
(see MultipleSelectList) and the item is one list item from viewDataList
.
The problem is: val is for some reason, not an ID or a list of IDs, it is an anonymous function:
function (val) {
var temp = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(new
Set([].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(val),
[value])));
return temp;
}
(I don't really understand what this is). Any help would be appriciated.
MultipleSelectList
{viewDataList.map((item, index) => (
<MultipleSelectList
data={item.list.map(listItem => ({
value: listItem.id, //here
}))}
save="value"
setSelected={(val) => handleSelect(val, item)}
selected={selected.map(item => item.value)}
/>
))}
handleSelect/Async saving
const handleSelect = async (val, item) => {
setSelectedCount(prevState => ({
...prevState,
[item.name]: prevState[item.name] + 1, //item.name = muscleGroup
}));
setSelected(prevState => ([
...prevState,
{
name: item.name,
value: val //val should be the ID(s)
},
]));
try {
await AsyncStorage.setItem('selected', JSON.stringify([
...selected,
{
name: item.name,
value: val,
}
]));
await AsyncStorage.setItem('selectedCount', JSON.stringify({
...selectedCount,
[item.name]: selectedCount[item.name] + 1,
}));
} catch (e) {
console.e('Error saving data to AsyncStorage:', e);
}
};
setExerciseViewLists
const setExerciseViewLists = () => {
let list = [];
list.push(
{.....},
{
num: 3,
name: "muscleGroup",
list: [{.....}, { id: "123", exercises : "somthing" }, {.....}]
},
{.....},
);
setViewDataList(list);
};
答案1
得分: 0
问题不在于您的数据,而在于您发送的自定义函数 handleSelect
作为 setSelected
属性。但是如果您查看库的文档,它明确说明了 setSelected
用于“设置将存储在本地状态中的选项值”。因此,您只能将选定的值存储在本地状态中。组件内的代码应该如下所示:
const [selectedValues, setSelectedValues] = useState();
return <MultipleSelectList
data={SOME_DATA}
save="value"
setSelected={setSelectedValues}
/>;
英文:
The issue is not with your data but with the setSelected prop for which you are sending a custom function handleSelect
. But if you see the library's documentation, it is clearly mentioned like setSelected is for For Setting the option value which will be stored in your local state
. So you can only store the selected values in the local state. The code should be like below inside the component.
const [selectedValues, setSelectedValues] = useState();
return <MultipleSelectList
data={SOME_DATA}
save="value"
setSelected={setSelectedValues}
/>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论