You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在非主Component内部创建动态Component?

修改笔记应用添加逻辑,将新组件嵌入CreateArea内部

核心思路

把原本在App组件中渲染的Note列表,转移到CreateArea组件内部渲染。通过将notes状态和删除方法传递给CreateArea,让它负责管理输入区域和下方的笔记列表。

具体修改步骤

1. 更新App组件

将笔记的渲染逻辑从App转移到CreateArea,同时把notes数组和deleteNote方法作为props传给CreateArea:

function App() {
  const [notes, setNotes] = useState([]);

  function addNote(newNote) {
    setNotes(prevNotes => [...prevNotes, newNote]);
  }

  function deleteNote(id) {
    setNotes(prevNotes => prevNotes.filter(note => note.id !== id));
  }

  return (
    <div>
      <Header />
      <CreateArea 
        onAdd={addNote} 
        notes={notes} 
        onDelete={deleteNote} 
      />
    </div>
  );
}

2. 修改CreateArea组件

在CreateArea内部添加笔记列表的渲染区域,同时确保添加笔记时生成唯一ID:

function CreateArea(props) {
  const [note, setNote] = useState({
    title: "",
    content: ""
  });

  function handleChange(event) {
    const { name, value } = event.target;
    setNote(prevNote => ({
      ...prevNote,
      [name]: value
    }));
  }

  function submitNote(event) {
    // 为新笔记添加唯一ID
    props.onAdd({...note, id: Math.random().toString(36).substr(2, 9)});
    setNote({
      title: "",
      content: ""
    });
    event.preventDefault();
  }

  return (
    <div className="create-area-wrapper">
      <form>
        <input
          name="title"
          placeholder="Title"
          value={note.title}
          onChange={handleChange}
        />
        <textarea
          name="content"
          placeholder="Take a note..."
          rows="3"
          value={note.content}
          onChange={handleChange}
        />
        <button onClick={submitNote}>Add</button>
      </form>
      {/* 在表单下方渲染所有笔记 */}
      <div className="notes-list">
        {props.notes.map(note => (
          <Note
            key={note.id}
            id={note.id}
            title={note.title}
            content={note.content}
            onDelete={props.onDelete}
          />
        ))}
      </div>
    </div>
  );
}

3. 优化样式(可选)

添加CSS让布局更清晰,确保笔记列表在输入区域下方合理排列:

.create-area-wrapper {
  max-width: 850px;
  margin: 2rem auto;
  padding: 0 1rem;
}

.notes-list {
  margin-top: 2rem;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  gap: 1.5rem;
}

这样修改后,每次点击添加按钮生成的新笔记组件,就会直接显示在CreateArea内部的输入表单下方,而非作为独立组件存在于外部。

内容的提问来源于stack exchange,提问作者Technavvy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 10:45:44