我有一个非常简单的下拉菜单.通过单击下拉菜单中的图标NewIcon,用户会看到一个下拉菜单.这里的一切都很简单.为了实现下拉菜单,我使用基数库(https://www.radix-ui.com/primitives/docs/components/dropdown-menu)

 <DropdownMenu.Root open={isOpen} onOpenChange={setIsOpen}>
  <DropdownMenu.Trigger>
      <NewIcon/>
  </DropdownMenu.Trigger>

  <DropdownMenu.Portal forceMount>
          <DropdownMenu.Content>
         ........here some components
          </DropdownMenu.Content>
  </DropdownMenu.Portal>
</DropdownMenu.Root>

但是,我也想用同一页上的另一个按钮(位于另一个组件中)来调用此下拉菜单. 例如,下面是呈现"编辑信息"按钮的另一个组件.告诉我如何点击此按钮打开下拉菜单

  <div>           
    <Button>
       Edit information
    </Button>
  <div>

推荐答案

似乎您所需要做的就是创建一个调度程序,该调度程序将切换状态以触发页面的重新呈现.

const MyDropdownMenu = ({ isOpen, onToggle }) => (
  <DropdownMenu.Root open={isOpen} onOpenChange={onToggle}>
    <DropdownMenu.Trigger>
      <NewIcon />
    </DropdownMenu.Trigger>

    <DropdownMenu.Portal forceMount>
      <DropdownMenu.Content>
        {/*content */}
      </DropdownMenu.Content>
    </DropdownMenu.Portal>
  </DropdownMenu.Root>
);

const AnotherComponent = ({ onToggle }) => (
  <div>
    <Button onClick={onToggle}>
      Edit information
    </Button>

    <MyDropdownMenu isOpen={false} onToggle={onToggle} />
  </div>
);

const App = () => {
  const [isOpen, setIsOpen] = useState(false);

  const toggleDropdown = () => {
    setIsOpen((prevIsOpen) => !prevIsOpen);
  };

  return <AnotherComponent onToggle={toggleDropdown} />;
};

export default App;

您可以将其用于任何您喜欢的状态管理器.唯一会改变的是数据存储的位置.

根据您的 comments 扩展了一个例子.

    const MyDropdownMenu = ({ isOpen, onToggle }) => (

      const handler = () => {
        console.log(`MyDropdownMenu`);
        onToggle();
      }
      <DropdownMenu.Root open={isOpen} onOpenChange={handler}>
        <DropdownMenu.Trigger>
          <NewIcon />
        </DropdownMenu.Trigger>

        <DropdownMenu.Portal forceMount>
          <DropdownMenu.Content>
            {/*content */}
          </DropdownMenu.Content>
        </DropdownMenu.Portal>
      </DropdownMenu.Root>
    );

    const AnotherComponent = ({ onToggle }) => (
      const handler = () => {
        console.log(`MyDropdownMenu`);
        onToggle();
      }
      <div>
        <Button onClick={handler}>
          Edit information
        </Button>

        <MyDropdownMenu isOpen={false} onToggle={onToggle} />
      </div>
    );

    const App = () => {
      const [isOpen, setIsOpen] = useState(false);

      const toggleDropdown = () => {
        setIsOpen((prevIsOpen) => !prevIsOpen);
      };

      return <AnotherComponent onToggle={toggleDropdown} />;
    };

    export default App;

Javascript相关问答推荐

HTML/JavaScript函数未执行

事件错误:类型错误:无法读取未定义的属性(读取stopPropagation)

在JS中获取名字和姓氏的首字母

Phaser框架-将子对象附加到Actor

django无法解析余数:[0] from carray[0]'

将自定义排序应用于角形数字数组

在Vite React库中添加子模块路径

将字符串UTC Date转换为ngx—counting leftTime配置值的数字

jQuery s data()[storage object]在vanilla JavaScript中?'

如何从Intl.DateTimeFormat中仅获取时区名称?

如何通过使用vanilla JS限制字体大小增加或减少两次来改变字体大小

如何在每次单击按钮时重新加载HighChart/设置HighChart动画?

使用Nuxt Apollo在Piniastore 中获取产品细节

Angular 形式,从DOM中删除不会删除指定索引处的内容,但会删除最后一项

如何在FastAPI中为通过file:/URL加载的本地HTML文件启用CORS?

如何使用<;Link>;执行与JS Reaction中的";window.Location=/GameOverDied;";类似的操作?

在表单集中保存更改时删除';禁用';

用另一个带有类名的div包装元素

如何在下一个js中更改每个标记APEXCHARTS图表的 colored颜色

ReferenceError:无法在初始化之前访问setData