当我将 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
| 归档时间: |
|
| 查看次数: |
10265 次 |
| 最近记录: |