如何将子组件的值暴露到父组件中?

2020-05-27 16:27:39 +08:00
 justyeh

代码如下:

<AssetList
      loading={loading}
      pagination={{ ...page, total }}
      data={data}
      infiniteScroll={infiniteScroll}
      hasMore={hasMore}
      onLoadmore={onLoadMore}
      handle={
        <HandleBox onClick={(e) => e.stopPropagation()}>
          <HandleItem onClick={handleEdit}>编辑</HandleItem>
          <HandleItem onClick={handleTogglePublish}>
            {item.isPublish === 'yes' ? '取消发布' : '发布'}
          </HandleItem>
          <HandleItem onClick={handleDel}>删除</HandleItem>
        </HandleBox>
      }
    />

我描述一下需求,AssetList 是一个列表组件,多个页面会用到,但是每个页面中对 AssetList 的操作是不同的,我想到的是将 handle 当一个属性传进去,现在的问题是不知道如何取到item(操作的项)的值

我以前写 vue 的,这个操作类似于 vue 中的作用域插槽,请问 react 有没有办法实现这种机制?

1688 次点击
所在节点    React
2 条回复
BingoXuan
2020-05-27 16:33:59 +08:00
props.children 就类似 vue 的 slot 。assetlist 需要一个接收处理函数的函数,把获取的 props.children 传给对应处理函数。
justyeh
2020-05-27 16:47:23 +08:00
嗯,自己解决了,一开始没有搜索对方向,帖子一发就找到办法了

还是谢谢楼上

```
const Handle = useCallback((rowData) => {
return (
<HandleBox onClick={(e) => e.stopPropagation()}>
<HandleItem onClick={() => handleEdit(rowData)}>编辑</HandleItem>
<HandleItem onClick={() => handleTogglePublish(rowData)}>
{rowData.isPublish === 'yes' ? '取消发布' : '发布'}
</HandleItem>
<HandleItem onClick={() => handleDel(rowData)}>删除</HandleItem>
</HandleBox>
)
}, [])

return (
<AssetList
loading={loading}
pagination={{ ...page, total }}
data={data}
infiniteScroll={infiniteScroll}
hasMore={hasMore}
onLoadmore={onLoadMore}
handle={Handle}
onItemDel={onItemDel}
/>
)
```

**AssetList**

```
const List = (
<div className={`asset-list ${layout} ${empty ? 'empty' : ''}`}>
{empty && !loading && <p className="empty-tip">暂无数据</p>}
{assetList.map((item) => (
<div key={item.id} className={`asset-item ${item.thumbnailType}`} onClick={() => onItemClick(item)}>
<div className="thumbnail">
<img
src={item.thumbnailType === 'image' ? item.thumbnail : AssetThumbnail[layout][item.thumbnailType]}
alt=""
/>
</div>
<div className="info">
<div className="name">{item.name}</div>
<div className="author">
{item.user?.dept?.name} {item.user.empName}
</div>
</div>
{handle && handle(item)}
</div>
))}
</div>
)
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/676027

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX