React Native TextInput 在 JSX 组件中失去焦点

n80*_*n80 7 jsx react-native

当我将 TextInput 移动到自定义 JSX 组件中时,一旦我修改文本,它就会失去焦点。

在下面的示例中,也在 render() 中创建了几乎相同的 TextInput,而没有使用组件标签,并且它不会失去焦点。

我已经阅读了有关 key 属性以及如果未指定或不唯一的情况下如何失去焦点的信息。然而,在下面的简单示例中,关键属性是唯一的。

import React, { Component } from 'react'
import {
  AppRegistry,
  Text,
  View,
  TextInput,
} from 'react-native'

class App extends Component {

    constructor(props) {
      super(props);

      this.state = { 
          text: "111"          
      };

    }

  render() {

    var t = this;

    function Dynamic(props) {

      var text = props.text;

      return  <TextInput key="textinput1" style={{width:"100%", padding:10, 
            borderWidth:1, marginTop:20, marginBottom:20}}
            onChangeText={(text) => { t.setState({text}) } }                                
            value={text}
            />

    }

    return (
      <View >        
        <Text>DYNAMIC COMPOMENT - LOSES FOCUS</Text>        
        <Dynamic key="dynamickey" text={this.state.text}></Dynamic>         

        <Text>NOT DYNAMIC - KEEPS FOCUS</Text>
        <TextInput key="textinput2" style={{width:"100%", padding:10, 
            borderWidth:1, marginTop:20, marginBottom:20}}
            onChangeText={(text) => { t.setState({text}) } }                             
            value={this.state.text}
            />                
      </View>
    )
 }
}

AppRegistry.registerComponent('App', () => App)
Run Code Online (Sandbox Code Playgroud)

任何有关这里发生的事情或如何处理的意见都将非常感激。

小智 10

看起来问题在于您在其父级渲染方法中定义 Dynamic,然后直接调用父级的 setState 方法(而不是通过 props 传递),这会导致您不想要的重新渲染。试试这样:

import React, { Component } from "react";
import { AppRegistry, Text, View, TextInput } from "react-native";

class App extends Component {
  constructor(props) {
    super(props);

    this.state = {
      text: "111"
    };
  }

  render() {
    var t = this;

    return (
      <View>
        <Text>DYNAMIC COMPOMENT - LOSES FOCUS</Text>
        <Dynamic
          key="dynamickey"
          text={this.state.text}
          changeText={text => this.setState({ text })}
        />

        <Text>NOT DYNAMIC - KEEPS FOCUS</Text>
        <TextInput
          key="textinput2"
          style={{
            width: "100%",
            padding: 10,
            borderWidth: 1,
            marginTop: 20,
            marginBottom: 20
          }}
          onChangeText={text => {
            t.setState({ text });
          }}
          value={this.state.text}
        />
      </View>
    );
  }
}
const Dynamic = ({ text, changeText }) => {
  return (
    <TextInput
      key="textinput1"
      style={{
        width: "100%",
        padding: 10,
        borderWidth: 1,
        marginTop: 20,
        marginBottom: 20
      }}
      onChangeText={changeText}
      value={text}
    />
  );
};

AppRegistry.registerComponent("App", () => App);
Run Code Online (Sandbox Code Playgroud)

这是一个工作示例: https: //snack.expo.io/BJ-SARfdM