Maison  >  Article  >  interface Web  >  Comment communiquer dans différentes situations en vue ? façon de partager

Comment communiquer dans différentes situations en vue ? façon de partager

青灯夜游
青灯夜游avant
2022-04-20 20:39:142474parcourir

Comment communiquer dans différentes situations en vue ? L'article suivant analysera les méthodes de communication dans vue dans différentes circonstances. J'espère qu'il sera utile à tout le monde !

Comment communiquer dans différentes situations en vue ? façon de partager

En fait, tout le monde connaît la communication entre composants en vue. Même si vous ouvrez la bouche, après tout, c'est ce qui est souvent demandé lors des entretiens. Comme je n'y avais pas réfléchi attentivement auparavant, lorsque j'écrivais un petit projet, j'ai rencontré le besoin de communication dans les composants, puis j'ai commencé à l'écrire. Après avoir vérifié pendant longtemps, j'ai réalisé. que cette méthode n'était pas adaptée à cette situation. Ainsi, après cet incident, j'ai décidé d'écrire un article pour classer les méthodes de communication plus clairement et plus soigneusement. Après tout, toutes les méthodes de communication ne conviennent pas à tous les scénarios. (Partage vidéo d'apprentissage : tutoriel vuejs)

Dans la même fenêtre (c'est-à-dire dans le même onglet du même navigateur)

La principale chose impliquée dans le même onglet du même navigateur est le transfert de valeur de composants parent-enfant.

vuex : State Manager : Applicable à n'importe quel composant d'un projet, extrêmement inclusif

Tout le monde devrait être familier avec le concept de gestionnaire d'état.

  • Plusieurs composants peuvent partager une ou plusieurs valeurs d'état. Quelle que soit la profondeur de la hiérarchie des composants, elle est accessible normalement. Il s'agit donc d'une méthode de communication officiellement prise en charge directement.
  • Remarque : Pour les petites applications d'une seule page, cette option n'est pas très recommandée Pour les petits projets, l'utilisation de vuex deviendra plus lourde, tout comme une personne de 75 livres de 150 cm portant un 170 cm110. Tout comme les vêtements pesant lourdement sur un 170 cm110. personne, ils ont l’air très amples et ne peuvent pas être retenus.

provide / inject (écrit sur la base de la version 2.2.1 et supérieure) : Applicable aux composants de niveau N, mais doit être le type d'héritage sur une seule ligne

Cette paire d'options doit être utilisée ensemble pour permettre un composant ancêtre à tous ses descendants. Les descendants injectent une dépendance, quelle que soit la profondeur de la hiérarchie des composants, et elle prendra toujours effet tant que ses relations en amont et en aval sont établies.

  • C'est l'équivalent d'un bâtiment à N étages. Le niveau supérieur est le composant parent. Il y a un tuyau commun entre chaque étage. Ce tuyau est fourni. Le tuyau a une sortie à chaque étage appelée : inject
  • Remarque : les liaisons provide et inject ne sont pas réactives. Cependant, si vous transmettez un objet écoutable, les propriétés de l'objet restent réactives. provide 和 inject 绑定并不是可响应的。不过如果你传入了一个可监听的对象,那么其对象的 property 还是可响应的。
  • 让咱们来看看代码
// parent.vue
// 此处忽略template模板的东西
<script>
export default {
    name: &#39;parent&#39;,
    // provide有两种写法
    // 第一种
    provide: {
        a: 1,
        b: 2
    }
    // 第二种
    provide() {
        return {
            a: 1,
            b: 2
        }
    }
}
</script>
// child.vue
// 此处忽略template模板的东西
<script>
export default {
    name: &#39;child&#39;,
    // inject
    // 第一种
    inject: [ &#39;a&#39;, &#39;b&#39; ]
    // 第二种
    inject: {
        abc: { // 可以指定任意不与data,props冲突的变量名,然后指定是指向provide中的哪个变量
            from: &#39;a&#39;,
            default: &#39;sfd&#39; // 如果默认值不是基本数据类型,那就得改用:default: () => {a:1,b:2}
        },
        b: {
            default: &#39;33&#39;
        }
    }
}
</script>

props:适用相邻两组件的传值(父->子);$emit: 子 -> 父

正经的props/$emit可太常见了,都是用烂了的,就不用写示例代码了吧。

  • 只适用于相邻级别的父子组件之间传值
  • 对于多级组件的传值虽然也能用props传,但是吧,这样的话会让代码很难维护,极其不推荐。

eventBus: 地位与vuex差不多,适用任意组件,包容性极强

问题:

  • 不方便维护:如果在项目里用的多了,可能出现方法名冲突导致异常的问题,而且比较不方便排查。
  • 示例:
// utils/eventBus.js
import Vue from &#39;vue&#39;
const EventBus = new Vue()
export default EventBus
// main.js
// 进行全局挂载
import eventBus from &#39;@/utils/eventBus&#39;
Vue.prototype.$eventBos = eventBus
// views/parent.vue
<template>
    <div>
        <button @click="test">测试</button>
    </div>
</template>
<script>
export default {
    data() {
        return {}
    },
    methods: {
        test() {
            this.$eventBus.$emit(&#39;testBus&#39;, &#39;test&#39;)
        }
    }
}
// views/child.vue
<template>
    <div>
        {{ testContent }} <!-- test -->
    </div>
</template>
<script>
export default {
    data() {
        return {
            testContent: &#39;&#39;
        }
    },
    mounted() {
        this.$eventBus.$on(&#39;test&#39;, e => this.testContent = e)
    }
}

$attrs / $listeners

  • $attrs
    • 官方解释
      • 从父组件传给自定义子组件的属性,如果没有 prop 接收会自动设置到子组件内部的最外层标签上,如果是 class 和 style 的话,会合并最外层标签的 class 和 style
      • 如果子组件中不想继承父组件传入的非 prop 属性,可以使用 inheritAttrs 禁用继承,然后通过 v-bind="$attrs" 把外部传入的 非 prop 属性设置给希望的标签上,但是这不会改变 class 和 style
    • 当父组件向子组件传值,但是子组件并没有全部将传过来的值在props中声明时,在子组件里就可以通过$attrs
    • Jetons un coup d'œil au code
    • // 需要监听的页面
      mounted() {
          window.addEventListener(&#39;storage&#39;, this.storageEvent);
      },
      beforeDestroy() {
          window.removeEventListener()
      }
      methods: {
          storageEvent(e) {
              console.log("storage值发生变化后触发:", e)
          }
      }
      rrreee

    props : Applicable au transfert de valeur entre deux composants adjacents (parent->child $emit: child-> parent

Les accessoires/$emit sérieux sont trop courants et ils sont tous surutilisés, il n'est donc pas nécessaire d'écrire un exemple de code. Comment communiquer dans différentes situations en vue ? façon de partager

    Uniquement applicable au transfert de valeurs entre les composants parents et enfants aux niveaux adjacents
    • Bien que les accessoires puissent également être utilisés pour transférer des valeurs​​pour les composants à plusieurs niveaux, cela rendra le code difficile à maintenir et est extrêmement déconseillé .
    • eventBus : Le statut est similaire à vuex Il convient à n'importe quel composant et est extrêmement tolérant

    Problèmes : Comment communiquer dans différentes situations en vue ? façon de partager

      Peu pratique à maintenir : si c'est le cas. trop utilisé dans le projet, des conflits de noms de méthodes peuvent provoquer des exceptions et il est plus difficile de dépanner.
    • Exemple :

    rrreeerrreeerrreeerrreee

    Comment communiquer dans différentes situations en vue ? façon de partager$attrs / $listeners🎜🎜🎜$attrs🎜🎜🎜Explication officielle🎜 : 🎜🎜 transmis du composant parent au composant enfant personnalisé Attributs , si aucun prop n'est reçu, sera automatiquement défini sur la balise la plus externe à l'intérieur du sous-composant. S'il s'agit de class et de style, ils le seront. fusionnés. Les balises les plus externes sont class et style. 🎜🎜Si le composant enfant ne souhaite pas hériter des attributs non-prop transmis par le composant parent, vous pouvez utiliser inheritAttrs pour désactiver l'héritage, puis transmettre v-bind="$attrs" Définit les attributs non prop transmis en externe sur la balise souhaitée, mais cela ne changera pas class et style🎜🎜 🎜🎜Lorsqu'un composant parent transmet une valeur à un composant enfant, mais que le composant enfant ne déclare pas toutes les valeurs transmises dans les accessoires, dans le composant enfant, vous pouvez utiliser $ attrs au proxy pour obtenir tous les composants parents. La valeur transmise. 🎜🎜Exemple : Voici le composant parent🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜Voici le composant enfant : Aucun accessoire déclaré🎜🎜🎜🎜🎜🎜🎜Voici l'affichage dom :🎜🎜 🎜🎜 🎜
    • 此时,通过dom可以发现,所有没有声明的信息,全部出现在了子组件的根元素上。
    • 如果要让没有声明的信息不出现在子组件的根元素上,那就在子组件与data同级的位置加个属性:inheritAttrs: false;这样就不会未通过props接收的变量就不会出现在子组件的根元素上了
    • 至于怎么传递给子组件的子组件的子组件的子组件....等,那就需要给子组件的子组件依次都绑定:v-bind="$attrs"即可。
    • 注意这样只适用于传递数据。

  • $listeners
    • 官方解释:包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件——在创建更高层次的组件时非常有用
    • 当父组件向子组件传递回调时,子组件可以通过$listeners代理所有回调。
    • 示例:这是父组件

Comment communiquer dans différentes situations en vue ? façon de partager

    • 这是子组件

Comment communiquer dans différentes situations en vue ? façon de partager

    • 这是执行展示:

      Comment communiquer dans différentes situations en vue ? façon de partager

    • 同时可以发现子组件加上inheritAttrs:false之后根组件里的未声明props接受的变量消失了

      Comment communiquer dans différentes situations en vue ? façon de partager

  • 最后:建议最好不要用这个玩意,虽然他们都可以相对便捷的将第一级组件的属性,方法回调传递给N级子组件中的任一级,但是之后进行bug定位,或者分析需求将会是一个比较大的挑战。

不同窗口(同浏览器不同页签内)

同浏览器的不同页签之间的通讯,大多数的场景是:项目里的增删改查都是打开的新页面,然后新增结束后就触发列表页重新获取列表。这种场景下有什么方法呢?

监听stroage事件

// 需要监听的页面
mounted() {
    window.addEventListener(&#39;storage&#39;, this.storageEvent);
},
beforeDestroy() {
    window.removeEventListener()
}
methods: {
    storageEvent(e) {
        console.log("storage值发生变化后触发:", e)
    }
}
  • 切记:第一条:要记得将监听的事件在组件销毁之前解除监听。否则会给你惊”喜“
  • 切记:第二条:其中监听方法回调一定要在methods中定义,然后通过this进行引用,否则你在解除事件监听的时候将无效。

不同浏览器

不同浏览器的同一网站的有通讯的必要吗?
如果有那就:websocket(比如聊天室)
哈哈哈哈

(学习视频分享:web前端开发编程入门

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer