javascript - 如何访问渲染中构造函数中定义的 react-natve 变量?
问题描述
我是新来的反应原生并面临定义/访问变量的问题我所做的是
export default class HomeScreen extends Component {
constructor(props) {
super(props);
const unit = [
{label: 'mm', value: 'mm'},
{label: 'cm', value: 'cm'},
{label: 'meters', value: 'm'},
{label: 'km', value: 'km'},
{label: 'inches', value: 'in'},
{label: 'feet', value: 'ft'},
{label: 'yards', value: 'yd'},
{label: 'miles', value: 'mi'},
{label: 'nautical miles', value: 'nmi'},
];
var selectedValue = 'mm';
}
render() {
return (
<View style={styles.screen}>
<ScrollView
contentInsetAdjustmentBehavior="automatic"
style={styles.scrollView}>
<View style={styles.body}>
<View style={styles.rowContainer}>
<Text style={styles.text}>Scale Ratio </Text>
<TextInput style={styles.textInput}>1</TextInput>
<TextInput style={styles.textInput}>12</TextInput>
</View>
<View style={styles.rowContainer}>
<Text style={styles.text}>Real Length </Text>
<TextInput style={styles.textInput}>120</TextInput>
{/* <TextInput style={styles.textInput}>mm</TextInput> */}
<View style={styles.container}>
<Picker
selectedValue={selectedValue}
style={{height: 50, width: 150}}
onValueChange={(itemValue, itemIndex) =>
setSelectedValue(itemValue)
}>
{unit.map(item => (
<Picker.Item label={item.label} value={item.value} />
))}
</Picker>
{/* <RNPickerSelect
style={styles.textInput}
onValueChange={value => console.log(value)}
items={this.unit}
/> */}
</View>
</View>
<View style={styles.rowContainer}>
<Text style={styles.text}>Scale Length </Text>
<TextInput style={styles.textInput}>10</TextInput>
<TextInput style={styles.textInput}>mm</TextInput>
</View>
</View>
</ScrollView>
</View>
);
}
}
但我收到错误
我无法同时访问unit
和selectedValue
解决方案
JavaScript方式(本)
将其保存到this
对象(构造函数创建并返回它)。
/* inside of constructor */
this.selectedValue = 'mm';
/* outside of constructor, but inside of class mthods*/
console.log(this.selectedValue); // 'mm'
this.selectedValue = 'qq';
JavaScript方式(静态变量)
将其保存为静态变量,该变量将在类外可用。
/* inside of constructor */
HomeScreen.selectedValue = 'mm';
/* outside of constructor, inside AND outside of class*/
console.log(HomeScreen.selectedValue); // 'mm'
HomeScreen.selectedValue = 'qq';
JavaScript方式(闭包)
ps这是可能的,但不推荐(根本不安全)
您可以将变量声明提升到课堂之外。在这种情况下,所有类内部都可以从闭包中获取变量并读取/重写该变量。
反应方式(状态)
如果您想在更改变量时看到 UI 更新,则必须使用响应式方式(更改订阅)。Reacts 为它提供了props
和state
. 如果你想处理内部反应类变量,你应该使用state
. 在这种情况下,每次更改状态时,您的 React 都会调用类render()
方法。
/* inside of constructor */
this.state = { selectedValue: 'mm' };
/* outside of constructor, inside of class methods */
console.log(this.state.selectedValue); // 'mm'
this.setState({ selectedValue: 'qq' });
使用 setState 提示
方法this.setState
是异步的,React 以异步方式处理此方法,以进行一些优化,将许多更新批处理在一起。
所以如果你在类方法中有这样的代码,你可能会得到下面的结果。(更新不是即时的)
this.setState({ selectedValue: 'qq' });
console.log(this.state.selectedValue) // 'mm'
但是您的render()
方法将正确处理它。
render() {
console.log(this.state.selectedValue); // 'qq'
/* ... */
}
推荐阅读
- bash - 如何在 .bashrc 文件中设置环境变量
- java - Tomcat 9 未在 Eclipse 中启动
- azure-blob-storage - Azure Blob 存储 - 时间点还原它会影响其他容器吗?
- mysql - 了解 MySQL InnoDB 锁
- java - 从 Firestore 实时更新数据
- jython - 从 2.7.1 升级到 2.7.2 后,Jython 代码停止工作
- javascript - 如何将变量从 Flask 应用程序传递到 Javascript 文件
- java - 无法使用 JSON 请求正文启用 Spring Authorization Server 令牌请求
- python-3.x - Python:屏幕外数据过多且不可滚动的表格
- visual-studio - 在 Visual Studio 的另一个解决方案中禁用引用项目的编辑代码