diff --git a/files/zh-cn/learn/tools_and_testing/client-side_javascript_frameworks/vue_refs_focus_management/index.md b/files/zh-cn/learn/tools_and_testing/client-side_javascript_frameworks/vue_refs_focus_management/index.md new file mode 100644 index 00000000000000..e043885a8b875b --- /dev/null +++ b/files/zh-cn/learn/tools_and_testing/client-side_javascript_frameworks/vue_refs_focus_management/index.md @@ -0,0 +1,228 @@ +--- +title: 使用 Vue 模板引用进行焦点管理 +slug: Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Vue_refs_focus_management +--- + +{{LearnSidebar}}{{PreviousMenuNext("Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Vue_conditional_rendering","Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Vue_resources", "Learn/Tools_and_testing/Client-side_JavaScript_frameworks")}} + +使用 Vue 所做的事情快要结束了。最后一个需要讲述的内容是焦点管理,换句话说,也是如何提升我们应用的键盘无障碍性。我们将看看如何使用 **Vue 模板引用**来处理这个问题——这是一个进阶功能,允许你直接访问虚拟 DOM 之下的底层 DOM 节点,或者从一个组件直接访问一个子组件的内部 DOM 结构。 + + + + + + + + + + + + +
前提: +

+ 熟悉核心的 HTMLCSSJavaScript 语言,了解终端/命令行知识。 +

+

+ Vue 组件是由管理应用程序数据的 JavaScript 对象和映射到基础 DOM + 结构的基于 HTML 的模板语法组成的。为了进行安装并使用 Vue + 的一些更高级的功能(例如“单文件组件(SFC)”或渲染功能),你将需要一个装有 + node + npm 的终端。 +

+
目标:学习如何使用 Vue 模板引用(ref)进行焦点管理。
+ +## 焦点管理问题 + +虽然我们完成了有效的编辑功能,但我们并没有为非鼠标用户提供良好的体验。具体来说,当用户激活“Edit”按钮时,我们将“Edit”按钮从 DOM 中移除,但我们并没有将用户的焦点移动到任何地方,所以实际上它只是消失了。这对键盘用户和非视觉用户来说可能会产生迷惑性。 + +了解一下发生了什么: + +1. 重新加载页面,然后按下 Tab 键。你可以看到在添加新的待办事项的输入框中看到一个表示聚焦状态的框线。 + +2. 再次按下 Tab 键。焦点应当移动到“Add”按钮。 + +3. 再次按下 Tab 键。这次它应该在第一个复选框上,且焦点在第一个“Edit”按钮上。 +4. 按下 Enter 键激活“Edit”按钮。复选框将替换为我们的编辑组件,但聚焦线就消失了。 + +这个行为可能令人震惊。此外,当再次按下 Tab 时会发生什么,取决于你所使用的浏览器。同样地,如果你保存或取消了你的编辑,当你移回非编辑视图时,焦点会再次消失。 + +为了给用户一个更好的体验,我们将添加代码来控制焦点,以便在编辑表单显示时将其设置为编辑字段。当用户取消或保存他们的编辑时,我们也要把焦点放回“Edit”按钮上。为了设置焦点,我们需要多了解一点 Vue 的内部工作方式。 + +## 虚拟 DOM 和模板引用 + +Vue 和其他一些框架一样,使用一个虚拟 DOM(VDOM)来管理元素。这意味着 Vue 在内存中保留了我们应用程序中所有节点的表示。任何更新首先在内存中的节点上执行,然后所有需要对页面上的实际节点进行的更改都会被批量同步。 + +由于读写实际的 DOM 节点通常比虚拟节点开销更大,虚拟 DOM 可以带来更好的性能。然而,这也意味着在使用框架时,你往往不应该直接通过原生浏览器 API(如 [`Document.getElementById`](/zh-CN/docs/Web/API/Document/getElementById))来编辑你的 HTML 元素,因为这会导致 VDOM 和真实 DOM 不同步。 + +相反,如果你需要访问底层 DOM 节点(比如设置焦点时),你可以使用 [Vue 模板引用](https://cn.vuejs.org/guide/essentials/template-refs.html)。对于自定义的 Vue 组件,你也可以使用 refs 来直接访问子组件的内部结构,然而这样做应该是谨慎的,因为这会使代码更难推理和理解。 + +要在一个组件中使用模板引用,你需要在你想访问的元素上添加一个 `ref` 属性,并为该属性的值添加一个字符串标识符。值得注意的是,在一个组件中,引用必须是唯一的。在同一时间呈现的两个元素不应该有相同的引用。 + +### 向我们的应用添加模板引用 + +现在,我们向 `ToDoItem.vue` 中的“Edit”按钮附加模板引用。像这样更新代码: + +```html + +``` + +为了访问与我们的引用相关的值,我们使用组件实例上提供的 `$refs` 属性。当我们点击“Edit”按钮时,要看到 ref 的值,在我们的 `toggleToItemEditForm()` 方法中添加 `console.log()`,像这样: + +```js +toggleToItemEditForm() { + console.log(this.$refs.editButton); + this.isEditing = true; +} +``` + +如果你在这时激活“Edit”按钮,你应该看到控制台中引用了一个 HTML `