【问题标题】:Native Base Input Refs Not Being Set未设置本机基本输入参考
【发布时间】:2018-09-26 17:19:56
【问题描述】:

所以我正在使用 Native Base <Input> 标签,尝试设置 refs 以通过表单字段处理“tabbing”。我有以下代码:

<Item floatingLabel>
  <Label style={{ color: "#fff" }}>First Name</Label>
  <Input
    ref={input => {
      this.firstNameRef = input;
    }}
    onSubmitEditing={() => {
      this.lastNameRef._root.focus();
    }}
    returnKeyType={"next"}
  />
</Item>

<Item floatingLabel last>
  <Label style={{ color: "#fff" }}>Last Name</Label>
  <Input
    ref={input => {
      this.lastNameRef = input;
    }}
  />
</Item>

所以本质上,我有 2 个&lt;Input&gt; 标签,都设置了refthis.firstNameRefthis.lastNameRef),但是在加载应用程序时,按名字,然后按键盘上的“下一步”我得到以下错误:

无法读取未定义的属性“_root”
onSubmitEditing
Signup.js:162:26

似乎使用&lt;Input&gt; 实际上并没有设置任何参考值,所以this.lastNameRefnull

我还尝试使用 React Native 的 &lt;TextInput&gt; 元素,它确实可以处理如上所述的设置 refs,但在提交后似乎仍然无法处理焦点(即使从 .focus() 逻辑中删除 ._root 也是如此)。

有其他人看到这个问题吗?

注意:目前仅在 iOS 中测试。

【问题讨论】:

    标签: javascript react-native reference native-base


    【解决方案1】:

    对已接受答案的更新:refgetRef 都可以工作,但只有一个可以根据包装组件工作。在这种情况下,我的&lt;Input&gt; 组件由&lt;Item&gt; 组件包装,每个组件都有不同的label 属性。比较:

    <Item floatingLabel>
      <Label>First Name</Label>
      <Input
        getRef={input => {
          this.firstNameRef = input;
        }}
        onSubmitEditing={() => {
          this.lastNameRef._root.focus();
        }}
        returnKeyType={"next"}
      />
    </Item>
    

    <Item fixedLabel>
      <Label>First Name</Label>
      <Input
        ref={input => {
          this.lastNameRef = input;
        }}
        onSubmitEditing={() => {
          this.lastNameRef._root.focus();
        }}
        returnKeyType={"next"}
      />
    </Item>
    

    对于floatingLabelgetRef 有效,而ref 无效。另一方面,对于fixedLabelref 有效,而getRef 无效。

    并不是真的要解释原因,但也许这个警告会在未来对其他人有所帮助。

    【讨论】:

    • 但我还没有完成......我有两个输入字段和一个提交按钮,在android上开发。 在第一个输入上侧重于第二个。有没有办法在提交按钮上输入第二个焦点?否则,当焦点在第二个输入时,键盘会隐藏提交按钮,隐藏键盘的唯一方法是点击“返回”按钮
    • 您不能真正将按钮聚焦在移动设备上(至少我不认为您可以,由于缺少光标,有点没有意义)。您可以做的最好的事情是在最后一次输入时设置returnKeyType={"done"},因此按&lt;Enter&gt; 或等效键将自动隐藏键盘。
    • @Yossi 话虽如此,您可以考虑提出更多详细信息;或许能得到更好的回应。
    • 如果您不向&lt;Item&gt; 传递任何参数,则ref 是有效的。
    【解决方案2】:

    对于 nativeBase 的输入组件,您需要使用 getRef 属性:

    <Input
      getRef={input => {
        this.lastNameRef = input;
      }}
    />
    

    【讨论】:

    • 你是对的;我只是在写一个自我回答的过程中(看到这里的帖子github.com/GeekyAnts/NativeBase/issues/…
    • ._root 在我的测试中似乎工作正常;没有看到任何关于.wrappedInstance的信息
    • 是的,wrappedInstance 部分只是我在提取一些执行此操作的旧代码时注意到的。我可能一直在使用旧版本或做一些奇怪的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 2020-08-12
    • 2019-10-23
    • 2020-08-12
    相关资源
    最近更新 更多