如何从反应中的子标签访问数据

how to access data from child tags in react

我试图确保我的自定义父组件可以访问其中的任何子组件。我正在尝试完成类似于以下的设置:

function App() {
  return (
    <div className="App">

      <Parent>
          <img src={spaceGasImg} height='100px' width='100px'></img>
      </Parent>

    </div>
  );
}

我希望能够从我的 img 标签中获取数据到我的父级中,甚至可能能够通过挂钩从父级中删除 img 标签。我不确定这是否最好通过使用高阶组件来处理?

有没有办法设置我的父组件,使其假定包裹在其中的任何东西都是一个子组件,并且可以读取该子组件的所有数据?

非常感谢您提出任何关于如何建立这种关系的建议:)

我会推荐你​​看看React.context(https://reactjs.org/docs/context.html),你会学到很多东西。

以下是我认为您需要处理的方式: 创建一个自定义 Parent 组件,并附加上下文,然后创建能够生成 img 标签列表的函数,以及更改它们的函数(removeImage()updateImage(), getImage(), ..).

  1. 创建您自己的上下文:
const MyContext = React.createContext(defaultValue);
  1. 创建您的父状态:
this.state = {
  images: [
      {
        id: 1
        url:'url1',
        height: '400px',
        width: '400px'
      }, 
      {
        id: 2
        url:'url2',
        height: '400px',
        width: '400px'
      }
    ]
  }
}
  1. 创建您的父组件:
class Parent extends React.Component {
  constructor(props) {
    super(props);
    this.removeImage = (id) => {
      // write the function to remove image from this.state.images array using id
    }
    this.getImage = (id) => {
      // write the function to get image from this.state.images array using id 
    }
    this.state = {/* past step 2 here */}
  }

  render() {
    return (
      <div>
        <MyContext.Provider value={this.state}>
          <MyContext.Consumer>
            {({images}) => (
              <div className="list-image">
                {images.map((img) => {
                    return (<img 
                              imgId={img.id} 
                              src={img.url} 
                              height={img.height} 
                              width={img.width} alt="nothing"
                            />);
                  }
                }
              </div>
            }}
          </MyContext.Consumer>
        </MyContext.Provider>
      </div>
    );
  }

这样您就可以更改 this.state.imgaes 列表,这将直接更改您的图像渲染列表。

希望这就是您所要求的 ;)

在 React 中,您可以:

1 - 将变量作为道具向下传递,让您的 child 组件知道上面声明的这个值。

2 - 将方法作为道具向下传递,在 parent 组件上设置状态值以传递 child 上面的值

这是组件通信的两种基本方式。如果不在 parent 上声明状态并向 child 提供更新它的方法,则无法与 parent 共享 child 值。

如果您不想一直向下传递值,但即使您希望所有 children 都知道某些事情,恕我直言,最好的方法是使用 Context API 和 Hooks。在你的例子中它会是这样的:

const ImgContext = React.createContext()

function App() {
  return (
    <div className="App">

    <ImgContext.Provider value={spaceGasImg}> // the name of this prop MUST be 'value'
      <Parent> 
        <Child />
      </Parent>
    </ImgContext.Provider>

    </div>
  );
}

function Child() {
  // Every component inside the Provider will have the value available in the 
  // useContext hook with the context as a parameter. 

  const contextValue = useContext(ImgContext) // spaceGasImg

  return (
    <img src={contextValue} />
  )

}

使用 useContext<ImgContext.Provider /> 的每个 child 组件都可以访问提供者

上传递的 value 道具