【问题标题】:Declaration element with id and access it in same JSX带有 id 的声明元素并在同一个 JSX 中访问它
【发布时间】:2020-02-13 07:50:48
【问题描述】:

我已经动态创建了 JSX,并且 1 个元素正在动态获取它的 ID:

{props.types[2].map((element, index) => {
            return (
              <tr key={index}>
                <td className="align-middle">
                  {element.Type &&
                    commonFuctions.splitCapitalLetterString(element.Type)}
                </td>
                <td className="align-middle">
                  <div className="slideThree">
                    <input
                      type="checkbox"
                      value="None"
                      id={element.Type}
                      name="check"
                    />
                    <label htmlFor={element.Type}></label>
                  </div>
                ....
                ....
                ....

如您所见,动态获取 id 属性的元素是复选框。下面在我拥有的同一个 JSX 中:

{/**********************PENSION TYPES***************************************** */}
      {props.types[0].length > 0
        ? DataExtract.uniquePensionTypes(props.types[0]).map(
            (element, index) => {
              {
                console.log(document.getElementById(`${element}`));
              }
            }
          )
        : ""}
    </div>

这里的重要部分是这个console.log。 getElementById 中的参数与复选框的 id 相同。但由于某种原因,它没有发现元素并且显示为空。所以我的问题是为什么?是否可以在同一个jsx中声明元素的id及以下来访问它?我什至尝试在此复选框及其下方放置静态 ID,以使用它的静态值访问它,但仍然无法正常工作。

【问题讨论】:

  • 在组件中使用 state 并存储所有动态 Id 并在 state 的其他绑定中使用它们。
  • 你在用同样的渲染方法做document.getElementById(${element})吗?
  • @ArpithaChandrashekara 相同的 JSX 但其他方法。

标签: javascript html reactjs jsx


【解决方案1】:

我们无法在 render 方法中访问 dom 元素。渲染只是在虚拟 DOM 上而不是在实际 DOM 上渲染更改。

如果您想访问在 DOM 上呈现的元素,请在 ComponentDidMountComponentDidUpdate 中执行相同操作。

【讨论】:

  • 我不太确定这一点如何值得赞成,因为生命周期方法与跟踪复选框事件的变化无关。此外,(由于在props 和其他一些hints 前面缺少this),很明显OP 不使用类组件(而是函数组件),因此 'render method',生命周期方法也与这里无关。
【解决方案2】:

您可以使用 React ref api 访问 dom。

Refs 提供了一种访问 DOM 节点或在 render 方法中创建的 React 元素的方法。

document.getElementById 正在显示 null,因为尚未创建 html 元素。不建议直接访问React 中的DOM 元素。

示例:

类组件

import React, {Component} from 'react';

class MyComponent extends Component {

  constructor(props) {
    super(props);
    this.myRef = React.createRef();
  }

  render() {
    return (
      <table>
        {props.types[2].map((element, index) => {
          return (
            <tr key={index}>
              <td className="align-middle">
                {element.Type &&
                  commonFuctions.splitCapitalLetterString(element.Type)}
              </td>
              <td className="align-middle">
                <div className="slideThree">
                  <input
                    type="checkbox"
                    value="None"
                    id={element.Type}
                    name="check"
                    ref={this.myRef}
                  />
                  <label htmlFor={element.Type}></label>
                </div>
              </td>
            </tr>
          );
        })}
      </table>
    );
  }
}

功能组件

import React, {useRef} from 'react'

function SomeComponent(props) {
  const inputEl = useRef(null);

  return (
    <table>
      {props.types[2].map((element, index) => {
        return (
          <tr key={index}>
            <td className="align-middle">
              {element.Type &&
                commonFuctions.splitCapitalLetterString(element.Type)}
            </td>
            <td className="align-middle">
              <div className="slideThree">
                <input
                  type="checkbox"
                  value="None"
                  id={element.Type}
                  name="check"
                  ref={inputEl}
                />
                <label htmlFor={element.Type}></label>
              </div>
            </td>
          </tr>
        );
      })}
    </table>
  );
}

【讨论】:

  • 如何使用代码第二部分中的 ref 访问此元素?:{/**********************PENSION类型********************************************** */} {props.types[ 0].长度 > 0 ? DataExtract.uniquePensionTypes(props.types[0]).map( (element, index) => { { console.log(document.getElementById(${element})); } } ) : ""}
    跨度>
  • 您可以添加完整的组件代码,或者可以为此创建代码和框
  • 谢谢,正在调查。
  • 我已经更新了代码,你可以试试。 codesandbox.io/s/distracted-aryabhata-8tsn8
  • @BorislavStefanov :官方教程中有一个关于 Refs 的部分,称为 When to use Refs 并且推荐的用例都不适合您的问题。此外,它声明'避免对可以以声明方式完成的任何事情使用 refs'。标准方法是使用事件处理程序lifted 向上一级跟踪表组件状态中的选定行。您可以通过 here 查看该方法的实际应用。
  • 猜你喜欢
    • 2017-08-27
    • 2012-06-12
    • 2020-11-08
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多