当前位置: 代码迷 >> 综合 >> vue------处理边界情况(即一些需要对 Vue 的规则做一些小调整的特殊情况)
  详细解决方案

vue------处理边界情况(即一些需要对 Vue 的规则做一些小调整的特殊情况)

热度:71   发布时间:2024-02-26 17:35:14.0

访问元素&组件(手动操作其他组件的数据)


在绝大多数情况下,我们最好不要触达另一个组件实例内部或手动操作 DOM 元素,一些特殊情况:

 

 访问根实例:this.$root

  • 在每个 new Vue 实例的子组件中,其根实例可以通过 $root property 进行访问。
  • 在子组件中直接通过this.$root即可获取new  Vue()出来的根实例对象
  • 在绝大多数情况下,我们强烈推荐使用 Vuex 来管理应用的状态。

 

访问父组件实例:this.$parent(和$root使用方式一样,可以获取父组件的实例对象)

对于直接操作数据的问题,总会出现问题:当组件层级过深时,你并不确定到底几层parent

 

 访问子组件实例或子元素:this.$refs.自定义子组件ID

即便存在 prop 和事件,有的时候你仍可能需要在 JavaScript 里直接访问一个子组件。

为了达到这个目的,通过 ref 这个 attribute 为子组件赋予一个 ID 引用。例子如下:

这仅作为一个用于直接操作子组件的“逃生舱”,你应该避免在模板或计算属性中访问 $refs

<base-input ref="usernameInput"></base-input>调用当前组件实例: this.$refs.usernameInput  即可获取当前组件实例对象实例场景:当需要再父组件点击子组件输入框时,触发输入框的聚焦事件在父组件方法中:methods: {// 用来从父级组件聚焦输入框focus: function () {this.$refs.usernameInput.focus()}}

依赖注入(provide 和 inject)

1. provide 选项允许我们指定我们想要提供给后代组件的数据/方法:

    provide: function () { return { getMap: this.getMap } }

2. 然后在任何后代组件里,我们都可以使用 inject 选项来接收指定的我们想要添加在这个实例上的 property:

    inject: ['getMap']

 特点: 

  • 祖先组件不需要知道哪些后代组件使用它提供的 property
  • 后代组件不需要知道被注入的 property 来自哪里

 影响:

  • 依赖注入还是有负面影响的。它将你应用程序中的组件与它们当前的组织方式耦合起来,使重构变得更加困难
  • 通过 Vuex这样的状态管理插件来控制组件间的数据改动,可解决影响

程序化的事件监听器

  • 通过 $on(eventName, eventHandler) 侦听一个事件
  • 通过 $once(eventName, eventHandler) 一次性侦听一个事件
  • 通过 $off(eventName, eventHandler) 停止侦听一个事件

    何时用:

  • 你通常不会用到这些,但是当你需要在一个组件实例上手动侦听事件时,它们是派得上用场的。

组件间的循环引用

在本地注册组件的时候,你可以使用 webpack 的异步 import:components: {TreeFolderContents: () => import('./tree-folder-contents.vue')
}

 

强制更新:$forceUpdate

1. 在极少数的情况下需要手动强制更新,那么你可以通过$forceUpdate来做这件事

2. 可能依赖了一个未被 Vue 的响应式系统追踪的状态

通过v-once创建低开销的静态组件

使用情况:组件包含了大量静态内容。在根元素上添加 v-once attribute 以确保这些内容只计算一次然后缓存起来

说明:当你需要渲染大量静态内容时,极少数的情况下它会给你带来便利,除非你非常留意渲染变慢了,不然它完全是没有必要的

<template>
<div v-once><h1>Terms of Service</h1>... a lot of static content ...</div>
</template>