如何有效地通过 React 中父级的引用访问子级?

Posted

技术标签:

【中文标题】如何有效地通过 React 中父级的引用访问子级?【英文标题】:How to access child by the reference of parent in React effectively? 【发布时间】:2021-08-29 06:14:30 【问题描述】:

我的 html :-

<form>
  <div class="userPhoto"><img src="https://picsum.photos/300/700" ></div>
  <div class="name">
    <div class="fN">
      <p>First Name :</p>
      <div class="ic"><input type="text" name="first_name">
        <div class="icon">
          <div class="error" style="display: none; visibility: hidden;"><svg class="MuiSvgIcon-root" focusable="false" viewBox="0 0 24 24" aria-hidden="true">
              <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"></path>
            </svg></div>
          <div class="success" style="display: block;"><svg class="MuiSvgIcon-root" focusable="false" viewBox="0 0 24 24" aria-hidden="true">
              <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"></path>
            </svg></div>
        </div>
      </div>
    </div>
    <div class="fN">
      <p>Last Name :</p>
      <div class="ic"><input type="text" name="last_name">
        <div class="icon">
          <div class="error" style="display: none; visibility: hidden;"><svg class="MuiSvgIcon-root" focusable="false" viewBox="0 0 24 24" aria-hidden="true">
              <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"></path>
            </svg></div>
          <div class="success" style="display: block;"><svg class="MuiSvgIcon-root" focusable="false" viewBox="0 0 24 24" aria-hidden="true">
              <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"></path>
            </svg></div>
        </div>
      </div>
    </div>
  </div>
  <div class="email">
    <div class="cont">
      <p>Enter your email :</p>
      <div class="ic"><input type="email" name="email">
        <div class="icon">
          <div class="error" style="display: block; visibility: visible;"><svg class="MuiSvgIcon-root" focusable="false" viewBox="0 0 24 24" aria-hidden="true">
              <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"></path>
            </svg></div>
          <div class="success" style="display: none;"><svg class="MuiSvgIcon-root" focusable="false" viewBox="0 0 24 24" aria-hidden="true">
              <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"></path>
            </svg></div>
        </div>
      </div>
    </div>
    <div class="process">
      <p class="pc">Checking Availability...</p>
      <p class="ps">Email is available .</p>
      <p class="pe">This Email is already in use .</p>
    </div>
  </div>
  <div class="contact_no">
    <div class="cont">
      <p>Enter your contact number :</p>
      <div class="ic"><input type="number" name="email">
        <div class="icon">
          <div class="error" style="display: none; visibility: hidden;"><svg class="MuiSvgIcon-root" focusable="false" viewBox="0 0 24 24" aria-hidden="true">
              <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"></path>
            </svg></div>
          <div class="success" style="display: block;"><svg class="MuiSvgIcon-root" focusable="false" viewBox="0 0 24 24" aria-hidden="true">
              <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"></path>
            </svg></div>
        </div>
      </div>
    </div>
    <div class="process">
      <p class="pc">Checking Availability...</p>
      <p class="ps">contact no. is available .</p>
      <p class="pe">This contact no. is already in use .</p>
    </div>
  </div>
  <div class="userName">
    <div class="cont">
      <p>Choose an user name:</p>
      <div class="ic"><input type="text" name="email">
        <div class="icon">
          <div class="error" style="display: block; visibility: visible;"><svg class="MuiSvgIcon-root" focusable="false" viewBox="0 0 24 24" aria-hidden="true">
              <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"></path>
            </svg></div>
          <div class="success" style="display: none;"><svg class="MuiSvgIcon-root" focusable="false" viewBox="0 0 24 24" aria-hidden="true">
              <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"></path>
            </svg></div>
        </div>
      </div>
    </div>
    <div class="process">
      <p class="pc">Checking Availability...</p>
      <p class="ps">user name is available .</p>
      <p class="pe">This user name is already in use .</p>
    </div>
  </div>
  <div class="password">
    <div class="cont">
      <p>create an strong PASSWORD:</p>
      <div class="ic"><input type="password" name="email">
        <div class="icon">
          <div class="error" style="display: none; visibility: hidden;"><svg class="MuiSvgIcon-root" focusable="false" viewBox="0 0 24 24" aria-hidden="true">
              <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"></path>
            </svg></div>
          <div class="success" style="display: block;"><svg class="MuiSvgIcon-root" focusable="false" viewBox="0 0 24 24" aria-hidden="true">
              <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"></path>
            </svg></div>
        </div>
      </div>
    </div>
  </div>
  <div class="conform_password">
    <div class="cont">
      <p>conform password:</p>
      <div class="ic"><input type="password" name="email">
        <div class="icon">
          <div class="error" style="display: none; visibility: hidden;"><svg class="MuiSvgIcon-root" focusable="false" viewBox="0 0 24 24" aria-hidden="true">
              <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"></path>
            </svg></div>
          <div class="success" style="display: block;"><svg class="MuiSvgIcon-root" focusable="false" viewBox="0 0 24 24" aria-hidden="true">
              <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"></path>
            </svg></div>
        </div>
      </div>
    </div>
  </div>
  <div class="formSubmit">
    <div class="button">
      <p>Sign up</p>
    </div>
  </div>
</form>

我将 const form = useRef(null); 引用到 html form 元素。

但我需要 input 内的 .password class 值。

我现在在 React 中的表现如何

let passwordText = form.current.children[5].children[0].children[1].children[0].value;

但我认为这是不对的。因为它很长。而且我不愿意使用另一个变量作为密码参考。

有没有简单快捷的方法来实现这一点?

【问题讨论】:

在反应世界中,每个元素都可以有自己的ref。为什么你坚持使用父 ref 来获取嵌套的子值,而不是在密码上使用新的 ref?也许最初的原因是错误的。 【参考方案1】:

实现这一点的最简单方法是在 javascript 中使用事件。 在密码输入上放置一个 onChange() 函数,如下所示

<input type="password" onChange=handleChange />

handleChange 函数看起来像

handleChange = (e) => console.log(e.target.value);

我在这里进行控制台日志记录只是为了举例。您可以将值保存在某个状态变量中,也可以直接保存到 localStorage 或外部数据库中。

如果您不想跟踪每次更改,您可以有一个按钮并仅在该按钮单击时调用此方法,这将减少调用此函数的时间。

要使用 useRef() 做同样的事情,您可以在密码本身的输入标签上放置一个引用 const password = useRef(null)。您可以使用 password.current.value 从该输入中获取值。

我希望这个答案会有所帮助。如果是,请将其标记为已接受。

【讨论】:

所以我必须为仅密码创建另一个变量??【参考方案2】:

由于您已经可以访问formRef,因此您可以使用以下内容获取表单中的特定输入。

const passwordEl = formRef.current.querySelector('.password')

现在你可以像这样访问它的属性了

console.log(passwordEl.value, passwordEl.name)

这是一个使用 age 输入字段的示例

codesandbox

【讨论】:

以上是关于如何有效地通过 React 中父级的引用访问子级?的主要内容,如果未能解决你的问题,请参考以下文章

react中父级props改变,更新子级state的多种方法

PHP在父级中访问子级的私有属性

React,将在父级创建的引用传递给子级

找到堆的父级和子级的方程式背后的直觉是啥?

CSS中父级的hover改变子元素和样式

CSS中父级的hover改变子元素和样式