Svelte:如何将数据或道具从子组件传递到父组件?

Oma*_*osh 6 javascript svelte svelte-component svelte-3

我会尽量简短。我有主要组件 app.svelte。在其中我使用了一个名为 Course.svelte 的子组件。我使用 {#each} 块多次重复同一组件。问题是我希望 app.svelte 知道每当单个组件打开时:单击。现在我正在处理 Course.svelte 组件中的 on:click 事件。这样,App.svelte 将永远不会知道这一点。我应该怎么办?

Course.svelte 的片段以及我如何处理 on:click 事件:

<script>
  function handleClick() {
    if (state == courseStates.CLOSED) {
      //Handle closed course
    } else {
      if (state === courseStates.READY) {
        passCourse();
      } else if (state === courseStates.PASS) {
        failCourse();
      }
    }
  }
  function passCourse() {
    state = courseStates.PASS;
  }
  function failCourse() {
    state = courseStates.READY;
  }
</script>

<div on:click={handleClick} class="text-center course btn {buttonClass}">
  <h1>{name}</h1>
  <h4>{code} - {credit} Credit Hours - Term {term}</h4>
</div>
Run Code Online (Sandbox Code Playgroud)

App.svelte 的一个片段,我想通过单击课程来维护每个课程随时间变化的状态:

<div class="row">
    {#each courses as course}
      {#if course.term == term}
        <Course
          state={course.state}
          name={course.name}
          credit={course.credit}
          term={course.term}
          code={course.code}
          on:removecourse={removeCourse} />
      {/if}
    {/each}
  </div>
Run Code Online (Sandbox Code Playgroud)

gro*_*hjy 11

您可以通过添加 App.svelte 来使用双向数据绑定bind:state={course.state}。现在,如果 Course.svelte 中的值发生更改,App.svelte 中的值也会更新。

\n

这是一个 REPL:
\n https://svelte.dev/repl/48649794a7144d63bbde67a2db2f67a9?version=3.24.1

\n

有更好的方法来处理这个问题,并且在使用双向绑定时应该小心。通过双向绑定,您\xe2\x80\x99将很容易弄乱您的数据流。

\n

处理数据流的更好方法:

\n
    \n
  • 将函数从父级传递给子级
  • \n
  • 将整个数据对象传递给子组件
  • \n
  • 使用store
  • \n
  • 使用自定义事件createEventDispatcher
  • \n
\n