【发布时间】:2021-10-02 17:15:48
【问题描述】:
我试图让图标在单击时切换其视觉效果(如复选框)。通常在本机反应中我会做这样的事情:
const [checkbox, setCheckbox] = React.useState(false);
...
<TouchableHighlight underlayColor="transparent" onPress={() => {setCheckbox(!setCheckbox)}}>
{added ? <MaterialIcons name="playlist-add-check" size={40} />
: <MaterialIcons name="playlist-add" size={40} />}
</TouchableHighlight>
但是我做了一些更改,现在我似乎无法复制这种行为。我正在使用 AsyncStorage 类来存储和获取要显示的对象数组。为简单起见,在下面的示例中我删除了存储代码,并且每个对象都有一个 'id' 和一个 'added' 属性,这本质上是复选框的布尔值。
我现在正在尝试更新每次按下时向用户显示的图标。我知道正在调用该函数,但它不会更新图标。我正在使用 array.map 创建图标列表。我这里做了一个demo,代码如下:https://snack.expo.dev/@figbar/array-map-icon-update
const templateObject = {
id: 0,
added: false,
};
const templateObject2 = {
id: 1,
added: true,
};
export default function App() {
const [savedNumbers, setSavedNumbers] = React.useState([]);
React.useEffect(() => {
setSavedNumbers([templateObject,templateObject2]);
}, []);
const populateSavedNumbers = () =>
savedNumbers.map((num, index) => <View key={index}>{renderPanel(num.id,num.added)}</View>);
const updateNumber = (id) => {
let capturedIndex = -1;
for(var i = 0; i < savedNumbers.length; i += 1) {
if(savedNumbers[i].id === id) {
capturedIndex = i;
break;
}
}
let _tempArray = savedNumbers;
_tempArray[capturedIndex].added = !_tempArray[capturedIndex].added;
setSavedNumbers(_tempArray);
}
const renderPanel = (id:number, added:boolean) => {
return (
<View>
<TouchableHighlight underlayColor="transparent" onPress={() => {updateNumber(id);}}>
{added ? <MaterialIcons name="playlist-add-check" size={40} />
: <MaterialIcons name="playlist-add" size={40} />}
</TouchableHighlight>
</View>
);
}
return (
<View>
<View>buttons:</View>
<View>{populateSavedNumbers()}</View>
</View>
);
}
【问题讨论】:
标签: reactjs react-native user-interface render