React Native:如何聚焦包装在自定义组件中的 TextInput?

Posted

技术标签:

【中文标题】React Native:如何聚焦包装在自定义组件中的 TextInput?【英文标题】:React Native: How to focus a TextInput wrapped in a custom component? 【发布时间】:2020-09-05 15:15:32 【问题描述】:

在我的 React Native 应用程序中,我有一个包含 TextInput 的自定义组件。在使用自定义组件的代码中,我想在TextInput 上调用.focus()。我尝试像这样直接在自定义组件上调用它:

<CustomComponent
  ref=ref => 
    this.customComponent = ref;
  
/>

this.customComponent.focus();

但我不能,因为我认为自定义组件没有focus() 方法。我可以找到一种在包装好的TextInput 上调用它的方法,但我想知道是否有一种方法可以直接在自定义组件上调用它。

有人知道我该如何处理吗?

【问题讨论】:

可以在CustomComponent中定义焦点函数,调用TextInput的焦点函数。 【参考方案1】:

如果是类组件,您可以使用CustomComponent.prototype.yourFunction()

youFunction 使用 ref 在TextInput 上调用focus()

【讨论】:

【参考方案2】:

如果 CustomComponent 是您自己的组件,那么在这种情况下,您可以通过 Forwarding Refs 传递 ref:


这里我创建了示例代码 sn-ps,它在 CustomComponent 内部有输入,我们可以通过 React.forwardRef((props, ref) 访问该组件内部的 ref

然后我们有来自父组件的createRef 并像&lt;CustomComponent ref=this.ref&gt; 一样传递引用。

希望这会对你有所帮助。

const CustomComponent = React.forwardRef((props, ref) => (
  <div>
    <input type="text" ref=ref />
  </div>
));

class App extends React.Component 
  constructor(props) 
    super(props);
    this.ref = React.createRef();
  
  componentDidMount() 
    if(this.ref.current) 
      this.ref.current.focus();
    
  
  
  render() 
    return (
      <div>
        Get Focused : 
        <CustomComponent ref=this.ref />
      </div>
    );
  
  


ReactDOM.render(<App />, document.getElementById('react-root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="react-root"></div>

【讨论】:

以上是关于React Native:如何聚焦包装在自定义组件中的 TextInput?的主要内容,如果未能解决你的问题,请参考以下文章

React Native 系列

React:检测并包装自定义元素中的链接

有没有办法可以将 Text 组件的全部内容包装在 react-native 中的父视图中?

我可以将 wix/react-native-navigation 创建的根组件包装在 ApolloProvider 组件中吗

Ionic2 组件包装在自定义组件中

聚焦时如何摆脱React Native Paper TextInput的底部边框