arrays - 来自 Json 的 React-Name 数组,以变量为键
问题描述
我不是 100% 确定如何问这个问题,而且我对 react-native 还很陌生。我有一个类别列表,其中包含计数。在 PHP 中,我可能会这样做:
$purchases['kayaks'] = 0;
$purchases['kayaks']++;
因此,每次出售此示例的皮划艇时,它都会增加。或者更具体地说是这样的:
$purchases[$categoryName]++;
我需要根据用户按下他们想要的类别来获取类别的名称并向其添加计数,然后将其以 json 格式存储在 AsyncStorage 中。
所以我知道我可以这样做:
{
"categories": [
{
"kayaks":"0"
}
]
}
如果我将其导入“产品”,我可以执行 products.categories.kayaks 来检索“0”(或任何购买计数),但我需要皮划艇能够成为基于用户所做选择的变量。所以更像 products.categories[categoryName] 的东西,或者更优化的方法是在 react-native 中。有什么方法(或者如果有比这更理想的方法)来完成这样的不同类别计数?
我希望这是有道理的。提前致谢!
解决方案
这是一个react-native
使用 AsyncStorage 读取/写入数据和操作对象的基本示例。查看https://facebook.github.io/react-native/docs/asyncstorage了解有关AsyncStorage
.
import React from 'react';
import { ActivityIndicator, AsyncStorage, StyleSheet, Text, TextInput, TouchableOpacity, View } from 'react-native';
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center'
},
input: {
minWidth: 100,
backgroundColor: 'red'
}
});
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
data: undefined,
categoryName: 'kayak' // default input value
};
}
componentDidMount() {
AsyncStorage.getItem('data').then(dataAsString => {
// if the data exists lets convert it into an Object we can easily edit
// else default to an empty object
this.setState({ data: dataAsString !== null ? JSON.parse(dataAsString) : {} });
});
}
handleIncrement = () => {
const { data: prevData, categoryName } = this.state;
const prevValue = prevData[categoryName];
// if the category doesn't exist the data lets default to 0
const newValue = prevValue !== undefined ? prevValue + 1 : 0;
this.setState({
data: {
...prevData, // keep all the previous data
[categoryName]: newValue // but set the selected category to the new value
}
});
};
handleSave = () => {
const { data } = this.state;
const dataAsString = JSON.stringify(data); // convert data into a string so AsyncStorage can save it properly
AsyncStorage.setItem('data', dataAsString); // save the data string
};
handleOnChangeText = categoryName => this.setState({ categoryName });
render() {
const { data, categoryName } = this.state;
return (
<View style={styles.container}>
{data === undefined ? (
<ActivityIndicator /> // While data is undefined (AsyncStorage is still doing getItem('data)) show a loading indicator
) : (
<React.Fragment>
<Text>{JSON.stringify(data, null, 2)}</Text>
<TextInput style={styles.input} value={categoryName} onChangeText={this.handleOnChangeText} />
<TouchableOpacity onPress={this.handleIncrement}>
<Text>Add/Increment</Text>
</TouchableOpacity>
<TouchableOpacity onPress={this.handleSave}>
<Text>Save</Text>
</TouchableOpacity>
</React.Fragment>
)}
</View>
);
}
}
export default App;
注意:最好使用对象来存储您的数据(正如 Cuong Tran Duc 提到的),因为您正在使用类别进行索引。
希望这个例子有帮助。
推荐阅读
- excel - MS Excel:是否有更简单的方法来使用 IF 语句检查匹配数据并输出日期?
- tcl - 检测移位+数字的键盘独立方式
- scala - 添加基于合规性分析器的检查
- python - Pandas 输出和数据类型
- python - 有条件地搜索嵌套字典 Python 的更快方法
- node.js - 节点快递服务器未使用 aws lambda 为 Angular 应用程序呈现静态内容
- c++11 - Eignen 矩阵状态向量对一些样本进行平均以进行方向计算
- python - Python - regex.match 和不同的文本编解码器?
- ios - 为什么我最近安装的应用程序不断降级?
- java - 是否可以使用硒验证昨天的交易