React Native: В массиве текстовых входов, которые затем отображаются в цикле, как получить n-й элемент и изменить эти элементы отдельно? - PullRequest
0 голосов
/ 24 февраля 2019

В этом модуле я пытаюсь создать модуль опроса, аналогичный модулю в твиттере.

сначала цвет границ ввода текста серый, а когда я фокусирую (нажимаю) текстовый ввод, только одиниз них (нажал один) должен быть синим.Та же идея, когда я набираю текст, они не должны получать одно и то же значение.Я должен иметь возможность получить каждое введенное мной значение ввода текста, щелкнув значок плюса, в виде строки

. Должен ли я использовать плоский список или просмотр списка вместо цикла for? React-Native Listview, нажмите строку и измените стиль этой строки Я также попытался решить ее в соответствии с этим примером.Я немного изменил этот пример, я смог изменить цвет границы одного клика.но все же я не смог получить значения ...

Есть решение?Спасибо.

снимок экрана 1

снимок экрана 2

Это мой код;

changeInputBorderColor = () => {
    const newinputBorderColor = cloneDeep(this.state.inputBorderColor);
    newinputBorderColor.bar = '#04A5F5';
    this.setState({inputBorderColor: {bar: newinputBorderColor.bar}});
};
changeInputBorderColor2 = () => {
    this.setState({
        inputBorderColor: {
            bar: 'grey'
        }
    })
};
incrementInputCount = () => {
    if (this.state.inputCounter < 5) {
        this.setState(prevState => {
            return {inputCounter: prevState.inputCounter + 1}
        });
        console.log(this.state.inputCounter);
    }
    else {
        this.setState(prevState => {
            return {inputCounter: prevState.inputCounter}
        });
        alert("Maximum soru sayısına ulaştınız");
    }
};

render() {
    let surveyOptions = [];
    for (let i = 0; i < this.state.inputCounter; i++) {
        console.log(this.state.inputCounter);
        surveyOptions.push(
            <View key={i}>
                <View>
                    <TextInput
                        style={[styles._surveyTextInput, {borderColor: this.state.inputBorderColor.bar}]}
                        onChangeText={(text) => this.setState({text})}
                        value={this.state.text}
                        onFocus={this.changeInputBorderColor}
                        onBlur={this.changeInputBorderColor2}
                        placeholder={"Secenek " + (i + 1)}
                    />
                </View>
            </View>
        )
    }
    return (
        <View style={styles._surveyMainContainer}>
            <View style={{flex: 0.8}}>
                {surveyOptions}
                <TouchableOpacity style={{position: 'absolute', right: 5, top: 5}}>
                    <Ionicons name={"ios-close-circle"}
                              size={30}
                              color={'black'}
                    />
                </TouchableOpacity>
                <TouchableOpacity style={{position: 'absolute', right: 5, top: 45}}
                                  onPress={this.incrementInputCount}>
                    <Ionicons name={"ios-add-circle"}
                              size={30}
                              color={'blue'}
                    />
                </TouchableOpacity>
            </View>
            <View style={{flex: 0.2}}>
                <View
                    style={styles.renderSeparator}
                />
                <Text style={{fontWeight: 'bold', margin: 5}}>Anket süresi</Text>
            </View>
        </View>
    );
}

1 Ответ

0 голосов
/ 24 февраля 2019

Вы можете сделать это с .map, однако вы должны правильно настроить его так, чтобы каждый TextInput имел свое собственное значение в состоянии.В настоящее время вы устанавливаете одно и то же значение в состоянии для каждого TextInput, в результате каждый TextInput имеет одно и то же значение.Понятно не то, что вы хотите.

  1. Создать начальный массив в состоянии (textArray), в котором все значения представлены в виде пустых строк, это будет использоваться для хранения значений из каждого TextInput.
  2. Установить для focusedIndex значение null в состоянии
  3. Создать функцию, которая использует предыдущее значение состояния для обновления текущего состояния.
  4. Создайте функцию, которая будет обрабатывать изменение цвета поля, она будет просто сравнивать индекс TextInput с текущим focusedIndex
  5. Перебирать textArray и создавать TextInput компоненты.Убедитесь, что каждый TextInput имеет свое собственное значение в состоянии.
  6. Убедитесь, что мы установили значение focusIndex в onFocus и onBlur в TextInput.Когда оно размыто, мы должны установить значение на ноль, чтобы оно убирало цвет границы при отклонении клавиатуры.

Так что мы могли бы сделать что-то вроде следующего

export default class App extends React.Component {

  constructor(props) {
    super(props);
    // construct an array with the number of textInputs we require, 
    // each value an empty string
    // set this array in state
    // set the focusedIndex to null
    let textArray = Array(6).fill('');
    this.state = {
      textArray: textArray,
      focusedIndex: null
    }
  }

  // this function will handle setting of the state when each TextInput changes
  onChangeText = (text, index) => {
    // as there are going to be a lot of setState calls
    // we need access the prevState before we set the next state.
    this.setState(prevState => {
      prevState.textArray[index] = text
      return {
        textArray: prevState.textArray
      }
    }, () => console.log(this.state.textArray))
  }

  // handle the border color
  handleBorderColor = (index) => {
    return index === this.state.focusedIndex ? 'red' : 'grey'
  }

  render() {
    // here we map the items in the `this.state.textArray` 
    // notice that each TextInput is give a specific value in state
    // that will stop the overlap
    return (
      <View style={styles.container}>
        {this.state.textArray.map((text, index) => {
          return <TextInput
            style={{height: 40, marginVertical: 10, borderColor: this.handleBorderColor(index), borderWidth: 1}}
            onChangeText={text => this.onChangeText(text, index)} 
            value={this.state.textArray[index]}
            placeholder={`placeholder for ${index}`}
            onFocus={() => this.setState({focusedIndex: index})}
            onBlur={() => this.setState({focusedIndex: null})}
          />
        })}
      </View>
    );
  }
}

Еслизатем вы хотите получить доступ к определенному значению для TextInput, вы можете сделать это следующим образом

let value = this.state.textArray[index]; // where the index is the value you want

Вот пример закуски, показывающий работающий код https://snack.expo.io/@andypandy/map-multiple-textinputs

Это определенно стоитглядя на следующие статьи о состоянии, так как я использовал эти свойства в этом примере.

https://medium.learnreact.com/setstate-is-asynchronous-52ead919a3f0 https://medium.learnreact.com/setstate-takes-a-callback-1f71ad5d2296 https://medium.learnreact.com/setstate-takes-a-function-56eb940f84b6

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...