这是我的完整解决方案,然后是解释:
class MyComponent extends Component {
// initial state
state = {
inputsNumber: this.randomInputs()
}
getNextWord() {
// do some stuff
const nextInputNumber = this.randomInputs()
const inputsState = {}
// set all inputs to A
for (let p = 0; p < nextInputNumber) {
inputsState[this.inputKey(p)] = 'A'
}
// set new random number of inputs
this.setState({
...inputsState
inputsNumber: nextInputNumber,
// set rest of state here if needed ...
});
}
renderInputs() {
var products = []
// some code that generates a randomNumber
for (let p = 0; p < this.state.inputsNumber; p++){
products.push(
<TextInput
maxLength={1}
key={p}
onChangeText={(text) => this.handleChange(text, p)}
value={ this.state[this.inputKey(p)]}
/>
);
}
return products
}
handleChange (text, p) {
this.setState({
[this.inputKey(p)]: text
})
}
randomInput () {
return Math.floor(Math.random() * 8) + 1 // or whatever random function
}
inputKey (p) {
return 'input ' + p
}
}
第一件事:
我不认为你想在渲染函数中生成随机数。这意味着每次render will get called 时,输入的数量都会发生变化,这将导致非常糟糕的用户体验,因为每次状态变化都会调用渲染(可能)。所以使用状态来跟踪这个数字:
import React, { Component } from 'react'
class MyComponent extends Component {
// initial state
state = {
inputsNumber: this.randomInputs()
}
getNextWord() {
// do some stuff
this.setState({
inputsNumber: this.randomInputs(),
// set rest of state ...
});
}
randomInput () {
return Math.floor(Math.random() * 8) + 1 // or whatever random function
}
}
现在要正确使用您的输入,您还需要bound their values to the state:
renderInputs() {
var products = []
for (let p = 0; p < this.state.inputsNumber; p++){
products.push(
<TextInput
maxLength={1}
key={p}
onChangeText={(text) => this.handleChange(text, p)}
value={this.state[this.inputKey(p)]}
/>
);
}
return products
}
handleChange (text, p) {
this.setState({
[this.inputKey(p)]: text
})
}
inputKey (p) {
return 'input ' + p
}
现在要将所有输入“重置”为字母 A,我们需要对点击事件进行轻微修改:
getNextWord() {
// do some stuff
const nextInputNumber = this.randomInputs()
const inputsState = {}
// set all inputs to A
// since we don't know how many inputs we have, we use the 'nextInputNumber' we just generated.
for (let p = 0; p < nextInputNumber) {
inputsState[this.inputKey(p)] = 'A'
}
// set new random number of inputs
this.setState({
...inputsState
inputsNumber: nextInputNumber,
// set rest of state here if needed ...
});
}
注意:我还没有测试过这个。如果某些东西不起作用,请创建一个小提琴,我会将其修改为一个工作示例