在更改TextInput的值后,无法更改所选文本

时间:2017-04-11 08:48:34

标签: react-native

我已经创建了一个示例react-native app。 这个应用程序只包括TextInput和一个Button

export default class App extends Component {
  state = {
    inputValue: "You can change me!"
  };

  _handleTextChange = inputValue => {
    this.setState({ inputValue });
  };

  _handleSelectionChange = (event) =>{
    this.setState({seleksi : event.nativeEvent.selection});
    console.log(event.nativeEvent.selection);
  }

  _handleButtonPress = () => {
    this.setState({inputValue : "Paijo tenan"});
  };

  render() {
    return (
      <View style={styles.container}>
        <TextInput
          value={this.state.inputValue}
          onChangeText={this._handleTextChange}
          **onSelectionChange={(event)=>this._handleSelectionChange(event)}**
          style={{ width: 200, height:200, padding: 8 }}
          multiline={true}
        />

        <Button
          title="Press me"
          onPress={this._handleButtonPress}
        />
      </View>
    );
  }
}

当我设置onSelectionChange道具时,按下Button后。 TextInput上的文本选择显示异常。

点击按钮之前,选择显示项目符号开始和结束

Before button clicked, selection shows bullet start and end

之后,选择不显示项目符号开始和结束

After, Selection not show bullet start and end

但是当我在TextInput上键入一些文本时,它可以用于选择。

如何在单击按钮后使用TextInput上的onSelectionChange道具进行选择? 为什么会发生这种情况?如何调试?,我的代码看起来很好

我在这里创建了世博小吃https://snack.expo.io/rJ6VxW56x

3 个答案:

答案 0 :(得分:0)

我不完全确定这是不是你的意图......但是我找到了一个简单的解决方法,确保按下按钮后选择范围相同。

首先跟踪状态中的选择:

state = {
  inputValue: 'You can change me!',
  selection: {start: 0, end: 0},
};

在TextInput上使用selection道具:

selection={this.state.selection}

确保在_handleSelectionChange

中将选择保存到状态
_handleSelectionChange = (event) => {
  this.setState({ selection: event.nativeEvent.selection });
}

修改_handleButtonPress以在更新inputValue之前存储选择状态,并使用 hackish setTimeout在文本更改后恢复选择。超时的原因是给inputValue更新时间,这将触发我们想要忽略的_handleSelectionChange ...所以我们在文本更改后将其设置为之前的值,选择与之前相同的范围,你看到可拖动的项目符号

  _handleButtonPress = () => {
    const selectionBeforeChange = { start: this.state.selection.start, end: this.state.selection.end };
    this.setState({ inputValue : 'Paijo tenan' }, () => {
      setTimeout(() => {
        this.setState({ selection: selectionBeforeChange });
      }, 50);
    });
  };

我真的不喜欢在任何地方使用setTimeout,但这个解决方案可以根据您的需要工作。一个已知的问题是,如果新文本(按下按钮后)短于选择范围,则它将无法正确地迁移先前的选择。我确定您可以检查新值的长度,并将选择/缩短选择与有效选择长度进行比较,如果这是您的目标。

而且,正如用户Jaws所提到的......最好清楚将函数绑定到何处/何时。我喜欢在构造函数中绑定所有内容,以防止任何不必要的重新绑定/保持在一起。

  constructor(props) {
    super(props);
    this._handleButtonPress = this._handleButtonPress.bind(this);
    this._handleSelectionChange = this._handleSelectionChange.bind(this);
    this._handleTextChange = this._handleTextChange.bind(this);
  }

答案 1 :(得分:0)

我终于解决了! 像这样输入textinput值!

<TextInput ...>
    <Text>{this.state.inputValue}</Text>
</TextInput>

答案 2 :(得分:-3)

请稍作修改并尝试。

更改

        <StackLayout borderRadius="5px" borderColor="blue">         
            <Label class="body" [text]="'Description:  ' + product.Description"></Label>
            <Label class="body" [text]="'POS Description: ' + product.POSDescription"></Label>
            <Label class="body" [text]="'POS price:  R' + product.POSPrice"></Label>
            <Label class="body" [text]="'Stock On Hand:  ' + product.StockOnHand"></Label>
        </StackLayout>

_handleTextChange = inputValue => {
    this.setState({ inputValue });
  };