在NextJS中,我有3个组件"侧边栏"、"编织"和"工具页",各自的代码附在下面.

ToolsPage:

"use client"
import Woven from './components/weaved';
import Sidebar from './sidebar';
import { useState } from 'react';

const ToolsPage = () => {
  const [selectedTool, setSelectedTool] = useState('');

  const handleToolClick = (tool: string) => {
    setSelectedTool(tool);
  };

  const renderToolComponent = () => {
    if (selectedTool === 'weaviate') {
      console.log("inside render")
      return <Woven />;
    }
    return <></>;
  };

  return (
    <>
      <Sidebar onToolClick={handleToolClick} />
      <div>
        {selectedTool ? (
          // Render the selected tool component
          <>
            <div>{selectedTool}</div>
            {renderToolComponent()}
          </>
        ) : (
          <></>
        )}
      </div>
    </>
  );
};

export default ToolsPage;

Woven tool component:

"use client"

import { useState } from "react"

const Woven = async () => {
const [weaveApiKey,setWeaveApiKey] = useState('')
const [weaveURL,setWeaveURL] = useState('')

return(
    <>
    <form>
    <label>
          Weaviate API key:
          <input
            type="text"
            value={weaveApiKey}
            onChange={(e) => setWeaveApiKey(e.target.value)}
          />
        </label>
        <br/>
        <label>
          Weaviate Cluster URL:
          <input
            type="text"
            value={weaveURL}
            onChange={(e) => setWeaveURL(e.target.value)}
          />
        </label>
        <br/>
        </form>
        </>
)}

export default Woven

Sidebar component:

"use client"

type SidebarProps = {
  onToolClick: (tool: string) => void;
};

const Sidebar: React.FC<SidebarProps> = ({ onToolClick }) => {
  const toolNames = ['weaviate']; // Add other tool names as needed

  return (
    <div>
      <h2>Tools</h2>
        {toolNames.map((tool,index) => (
          <button key= {index} onClick={() => onToolClick(tool)}>
            {tool}
          </button>
        ))}
    </div>
  );
};

export default Sidebar;

Here I hardcoded only one tool called "weaviate" This is the sample output screen if I click on the weaviate button (The component did not appear):enter image description here

我在这里的主要目的是在单击weaviate按钮时将编织组件加载到Tools页面中,如图所示.

在这里,代码成功地进入renderComponent()函数(如在工具页面组件中使用控制台日志(log)语句所示,但它连续重复多次,并且屏幕受到冲击)

但在单击硬编码的编织按钮后,编织组件不会出现.


我try 了另一种情况--我在Tools第7行中直接将状态设置为"weaviate"

const [selectedTool, setSelectedTool] = useState('weaviate');

然后出现该组件:

enter image description here

但在单击该按钮时也会出现同样的问题.

最终目标:在点击按钮时,应该加载编织组件,而不需要多次重新渲染

推荐答案

try 为renderToolComponent和Pass selectedTool创建单独的组件作为其props .此外,从Woven组件中删除async并重试,如果要在该组件中进行API调用以在服务器端获取数据并呈现它,则在组件声明上定义一个异步函数,如下所述:https://nextjs.org/docs/app/building-your-application/data-fetching/fetching

Javascript相关问答推荐

更新Reduxstore 中的状态变量,导致整个应用程序出现不必要的重新渲染

在NextJS中使用计时器循环逐个打开手风琴项目?

容器如何更改默认插槽中子项的显示?

RxJS setTimeout操作符等效

IMDB使用 puppeteer 加载更多按钮(nodejs)

如何用显示网格平滑地将元素从一个地方移动到另一个地方?

Phaser 3 console. log()特定游戏角色的瓷砖属性

Msgraph用户邀请自定义邮箱模板

当试图显示小部件时,使用者会出现JavaScript错误.

保持物品顺序的可变大小物品分配到平衡组的算法

优化Google Sheet脚本以将下拉菜单和公式添加到多行

如何将数据块添加到d3力有向图中?

一个实体一刀VS每个实体多刀S

我想使用GAS和HTML将从Electron 表格中获得的信息插入到文本字段的初始值中

输入的值的类型脚本array.排序()

每隔3个项目交替显示,然后每1个项目交替显示

在JavaScript中将Base64转换为JSON

TypeORM QueryBuilder限制联接到一条记录

如何用react组件替换dom元素?

使用Java脚本在div中创建新的span标记