【问题标题】:how to render component on onClick event handler如何在 onClick 事件处理程序上呈现组件
【发布时间】:2020-06-26 08:26:54
【问题描述】:

当用户单击按钮(使用 onClick)并呈现 Popper 组件时,我试图打开一个 Popper 元素,因为我在项目数组列表中使用此函数调用。我想在按钮触发后执行元素。

onClick 处理程序

const onAddToPlaylistClick = (evt, ytid) => {
  evt.stopPropagation();
  evt.preventDefault();

  console.log('here');
  const element = evt.currentTarget;
  console.log(element);   
  return (
    <ShowAddToPlaylistTooltip
      ytid={ytid}
      element={element}
      playlistState={playlistState}
      userState={userState}
      key={ToolTipKeys.AddToPlaylistToolTip}
    />
  );
};

按钮组件

const onAddToPlaylistClick = (evt) => {
  props.onAddToPlaylistClick(evt, props.ytid);
};

<IconButton className={classes.iconButton} onClick={onAddToPlaylistClick}>
  <PlaylistAddIcon className={classes.icon} />
</IconButton>

波普尔元素

const ShowAddToPlaylist = (props) => {
  const { ytid, userState, playlistState, element } = props;

  console.log('ShowAddToPlaylist...');

  const open = Boolean(element);

  const uid = userState.profile.uid;
  const userPlaylists = playlistState.playlistsByUser[uid] || [];

  const playlistList = userPlaylists.map((pid) => ({
    name: (playlistState.playlists[pid] ?? {}).name,
    pid: pid,
  }));

  const hasPlaylists = playlistList.length > 0;

  return (
    <Tooltip
      id={props.id}
      open={props.open}
      title="Add to playlist"
      anchorRef={element}
    >
      <AddPlaylistToolTip
        ytid={ytid}
        playlistList={playlistList}
      />
    </Tooltip>
  );
};

但是 onAddToPlaylistClick 没有触发 React Element,我做错了什么?

【问题讨论】:

  • 你在哪里使用 onAddToPlaylistClick?
  • @nafeo onAddToPlaylistClick 函数提供 console.log(element)。但不执行元素

标签: javascript reactjs


【解决方案1】:

你不能从onAddToPlaylistClick函数渲染JSX,但是你可以实现一些逻辑来渲染popover(或者如果你使用一些Router所以重定向......)

const onAddToPlaylistClick = (evt, ytid) => {
  evt.stopPropagation();
  evt.preventDefault();
  console.log('here');
  const element = evt.currentTarget;
  console.log(element);  
  this.setState({ element }) 
};

/// inside render (or `return` for function component...)

{ this.state.element && <ShowAddToPlaylistTooltip
      ytid={ytid}
      element={this.state.element}
      playlistState={playlistState}
      userState={userState}
      key={ToolTipKeys.AddToPlaylistToolTip}
    /> 
}

如果element 初始状态为null,则弹出框仅在单击后才会呈现。关闭它使用setState({ element: null })

【讨论】:

  • 我已经更新了问题,按钮是一个不同的组件并且有自己的功能。我在列表中呈现了一系列其他子组件。
  • 我明白你想要解释的内容,但我想将 ShowAddToPlaylistTooltip 设为全局,但将 HTML Element 添加到 redux 状态会导致违规。除了将其添加到本地状态之外,还有其他方法吗?
  • 如果“有没有其他方法”你的意思是仍然通过 redux,这是可能的,但是反模式和不完全是 redux 最佳实践导致 redux 意味着持有原语。但是您可能会在项目的某个地方useRef,并将.current 作为道具或使用上下文传递,或者实现一些基本的router
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 2020-11-24
  • 2019-06-06
  • 2020-04-09
  • 2013-03-04
相关资源
最近更新 更多