From 9689f4871d4c698a3f53d1c2a57bacb2059ba2fc Mon Sep 17 00:00:00 2001 From: hanyujie2002 <84226578+hanyujie2002@users.noreply.github.com> Date: Sat, 6 Jan 2024 10:16:42 +0800 Subject: [PATCH 1/8] zh-cn: init translation of advanced svelte --- .../index.md | 886 ++++++++++++++++++ 1 file changed, 886 insertions(+) create mode 100644 files/zh-cn/learn/tools_and_testing/client-side_javascript_frameworks/svelte_reactivity_lifecycle_accessibility/index.md diff --git a/files/zh-cn/learn/tools_and_testing/client-side_javascript_frameworks/svelte_reactivity_lifecycle_accessibility/index.md b/files/zh-cn/learn/tools_and_testing/client-side_javascript_frameworks/svelte_reactivity_lifecycle_accessibility/index.md new file mode 100644 index 00000000000000..22f0d73d25ec6c --- /dev/null +++ b/files/zh-cn/learn/tools_and_testing/client-side_javascript_frameworks/svelte_reactivity_lifecycle_accessibility/index.md @@ -0,0 +1,886 @@ +--- +title: "Svelte 进阶:响应性、生命周期以及无障碍" +slug: Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Svelte_reactivity_lifecycle_accessibility +page-type: learn-module-chapter +--- + +{{LearnSidebar}} +{{PreviousMenuNext("Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Svelte_components","Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Svelte_stores", "Learn/Tools_and_testing/Client-side_JavaScript_frameworks")}} + +在上一篇文章中,我们为待办事项列表添加了更多功能,并开始将应用程序组织成组件。在本文中,我们将添加应用程序的最终功能,并进一步组件化我们的应用程序。我们将学习处理与更新对象和数组相关的响应性问题。为了避免常见的问题,我们需要深入了解 Svelte 的响应性系统。我们还将解决一些无障碍聚焦问题,以及其他一些问题。 + +
前提: | +
+ + 至少,建议你熟悉核心 HTML< + /a>、CSS 和 JavaScript 语言,并且了解终端/命令行的使用。 + ++ 你需要安装了 Node.js 和 npm 的终端来编译和构建应用程序。 + + |
+
---|---|
目标: | ++ 学习一些高级的 Svelte 技巧,包括解决响应性问题、与组件生命周期相关的键盘无障碍问题等等。 + | +
至少,建议你熟悉核心 HTML< - /a>、、CSS 和 JavaScript 语言,并且了解` 字段和 *Add*(添加)按钮。 +- `NewTodo`:显示用于添加新待办事项的 `` 字段和 _Add_(添加)按钮。 - `TodosStatus`:显示“x out of y items completed”(“x 个已完成,共 y 个项目”)的状态标题。 ## 与我们一起编码 @@ -160,7 +159,7 @@ npx degit opensas/mdn-svelte-tutorial/05-advanced-concepts 为了弄清楚发生这种情况的原因,我们需要了解在更新数组和对象时 Svelte 中的响应性是如何工作的。 -许多 Web 框架使用虚拟 DOM 技术来更新页面。基本上,虚拟 DOM 是网页内容的内存副本。框架更新这个虚拟表示,然后将其与“真实” DOM 同步。这比直接更新 DOM 要快得多,并允许框架应用许多优化技术。 +许多 Web 框架使用虚拟 DOM 技术来更新页面。基本上,虚拟 DOM 是网页内容的内存副本。框架更新这个虚拟表示,然后将其与“真实”DOM 同步。这比直接更新 DOM 要快得多,并允许框架应用许多优化技术。 这些框架通常会在每次对虚拟 DOM 更改后重新运行我们的 JavaScript 代码,并应用不同的方法来缓存资源消耗巨大的计算和优化执行。它们几乎不会尝试理解我们的 JavaScript 代码在做什么。 @@ -502,7 +501,7 @@ const checkAllTodos = (completed) => { 那么这里发生了什么?当你在 Svelte 中更新组件的状态时,它不会立即更新 DOM。相反,它会等到下一个微任务来检查是否有其他需要应用的更改,包括其他组件。这样做可以避免不必要的工作,并允许浏览器更有效地批处理操作。 -在这种情况下,当 `editing` 是 `false` 时,编辑 `` 不可见,因为它不存在于 DOM中。在 `onEdit()` 函数中,我们将 `editing` 设置为 `true`,然后立即尝试访问 `nameEl` 变量并执行 `nameEl.focus()`。问题在于,Svelte 还没有更新 DOM。 +在这种情况下,当 `editing` 是 `false` 时,编辑 `` 不可见,因为它不存在于 DOM 中。在 `onEdit()` 函数中,我们将 `editing` 设置为 `true`,然后立即尝试访问 `nameEl` 变量并执行 `nameEl.focus()`。问题在于,Svelte 还没有更新 DOM。 解决这个问题的一种方法是使用 [`setTimeout()`](/zh-CN/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout) 函数,延迟调用 `nameEl.focus()`,直到下一个事件循环,并给 Svelte 更新 DOM 的机会。 @@ -668,7 +667,7 @@ node.addEventListener("focus", (event) => node.select()); ``` -3. 现在我们的 `onEdit()` 函数可以简单得多: +3. 现在我们的 `onEdit()` 函数可以简单得多: ```js function onEdit() { @@ -689,7 +688,7 @@ node.addEventListener("focus", (event) => node.select()); let editButtonPressed = false; // 跟踪编辑按钮是否已按下,以便在取消或保存后将焦点放在它上面 ``` -3. 接下来,我们将修改*编辑*按钮的特性来保存这个标志,并创建一个 action。像这样更新 `onEdit()` 函数: +3. 接下来,我们将修改*编辑*按钮的特性来保存这个标志,并创建一个 action。像这样更新 `onEdit()` 函数: ```js function onEdit() { @@ -704,7 +703,7 @@ node.addEventListener("focus", (event) => node.select()); const focusEditButton = (node) => editButtonPressed && node.focus(); ``` -5. 最后,我们在*编辑*按钮上使用 `focusEditButton` action,像这样: +5. 最后,我们在*编辑*按钮上使用 `focusEditButton` action,像这样: ```svelte