📜  如何将 id 属性应用于 ReactJS 组件的子元素?(1)

📅  最后修改于: 2023-12-03 15:38:43.983000             🧑  作者: Mango

如何将 id 属性应用于 ReactJS 组件的子元素?

在 ReactJS 中,我们可以使用 propsstate 将属性传递给组件。但是,如果我们需要将 id 属性应用于组件的子元素,该怎么办呢?

方法一:使用 forwardRef

forwardRef 是 React 提供的一种高阶组件(Higher Order Component),它可以让我们在组件中直接引用子元素的 ref。通过将 forwardRefuseImperativeHandle 结合使用,我们可以实现向子元素传递 id 属性。

import React, { forwardRef, useImperativeHandle, useRef } from 'react';

// 父组件
export default function ParentComponent(props) {
  const childRef = useRef(null);

  // 父组件调用子组件方法
  const handleClick = () => {
    childRef.current.handleClick();
  };

  return (
    <div>
      <ChildComponent ref={childRef} id="child-component" />

      <button onClick={handleClick}>点击子组件</button>
    </div>
  );
}

// 子组件
const ChildComponent = forwardRef((props, ref) => {
  const componentRef = useRef(null);

  // 子组件方法
  useImperativeHandle(ref, () => ({
    handleClick() {
      console.log('子组件被点击了!');
    },
  }));

  return (
    <div ref={componentRef} id={props.id}>
      这是子组件!
    </div>
  );
});

如上述代码所示,我们可以将 ChildComponent 改写成一个使用 forwardRef 的函数组件,并使用 useImperativeHandlehandleClick 方法暴露给父组件调用。在父组件中,我们将 ref 属性传递给了 ChildComponent,并可以通过 childRef.current 引用到子组件的方法和属性。

方法二:使用 Context

另一种向子元素传递 id 属性的方式是使用 Context,它允许我们在组件树中共享数据。我们可以通过 React.createContext 创建一个 Context 对象,然后在父组件中提供 id 属性,在子组件中使用 useContext 得到 id 属性。

import React, { useContext } from 'react';

// 创建一个 Context 对象
const ComponentIdContext = React.createContext('');

// 父组件
export default function ParentComponent(props) {
  return (
    <ComponentIdContext.Provider value="child-component">
      <ChildComponent />

      <button>点击子组件</button>
    </ComponentIdContext.Provider>
  );
}

// 子组件
const ChildComponent = () => {
  const id = useContext(ComponentIdContext);

  return (
    <div id={id}>
      这是子组件!
    </div>
  );
};

如上述代码所示,我们通过 ComponentIdContext.Providerid 属性提供给了 ChildComponent,在 ChildComponent 中使用 useContext 得到了 id 属性。这种方式通过 Context 对象实现了数据的共享,可以简化一些场景下的代码。