Maison > interface Web > js tutoriel > le corps du texte

Quelques points de connaissances importants dans Vue

小云云
Libérer: 2018-02-11 11:14:23
original
2149 Les gens l'ont consulté

Cet article partage principalement avec vous quelques points de connaissances importants sur Vue, en espérant aider tout le monde.

N'utilisez pas de fonctions fléchées sur les propriétés d'option ou les rappels

Par exemple,

  • créé : () => .a)

  • vm.$watch('a', newValue => this.myMethod())
    Parce que la fonction flèche est liée au contexte parent Ensemble, this ne sera pas une instance de Vue comme vous vous y attendiez, conduisant souvent à des erreurs comme Uncaught TypeError: Cannot read property of undefined 或 Uncaught TypeError: this.myMethod is not a function

Voir : ici

v-html

Les doubles accolades interpréteront les données comme du texte normal plutôt que du code HTML. Afin de générer du vrai HTML, vous devez utiliser la directive v-html :

<p>Using mustaches: {{ rawHtml }}</p><p>Using v-html directive: <span v-html="rawHtml"></span></p>
Copier après la connexion

Voir ici pour plus de détails :

Cache d'attributs calculés vs méthode

Nous pouvons définir la même fonction comme une méthode au lieu d'une propriété calculée. Le résultat final est en effet exactement le même dans les deux sens. Cependant, la différence est que les propriétés calculées sont mises en cache en fonction de leurs dépendances. Une propriété calculée n'est réévaluée que lorsque ses dépendances associées changent. Cela signifie que tant que le message n'a pas changé, plusieurs accès à la propriété calculée reverseMessage renverront immédiatement le résultat calculé précédent sans avoir à réexécuter la fonction.
Qu'est-ce que cela signifie que les propriétés calculées sont mises en cache en fonction de leurs dépendances ?

computed: {  now: function () {    return Date.now()
  }
}
Copier après la connexion

Bien que la valeur de Date.now() continue de changer, ce n'est pas watch car ce n'est pas une dépendance réactive.

Pour plus de détails, voir : ici

Les styles CSS ajoutent automatiquement des préfixes

Lorsque v-bind:style utilise des propriétés CSS qui nécessitent l'ajout de préfixes de moteur de navigateur, telles que transform, Vue .js détectera et ajoutera automatiquement le préfixe correspondant.

Pour plus de détails, voir : ici

Utiliser le regroupement de rendu conditionnel v-if sur l'élément <template>

Parce que v-if est une directive, elle doit être ajoutée à a sur les éléments. Mais que se passe-t-il si vous souhaitez changer plusieurs éléments ? À ce stade, vous pouvez traiter un élément comme un élément d'habillage invisible et utiliser v-if dessus. Le résultat final du rendu ne contiendra pas d'éléments <template>.

<template v-if="ok">  <h1>Title</h1>  <p>Paragraph 1</p>  <p>Paragraph 2</p></template>
Copier après la connexion

Voir ici

v-if et v-show et v-for

  • v- si c'est l'opération d'ajout et de suppression d'éléments de page

  • v-show est l'opération d'affichage et de masquage d'éléments de page

  • lorsque v- Lorsqu'il est utilisé ensemble avec if et v-for, v-for a une priorité plus élevée que v-if.

Pour plus de détails, voir : ici

Remarques sur la détection des changements de matrice

Vue ne peut pas détecter une matrice dont le mode a changé, la mise à jour de la vue sera donc ne pas être déclenché

  • Lorsque vous définissez un élément directement à l'aide de l'index, par exemple : vm.items[indexOfItem] = newValue

  • Lorsque vous modifiez la longueur du tableau, par exemple : vm.items.length = newLength

Pour plus de détails, voir : ici

Notes de détection de changement d'objet

Vue ne peut pas détecter l'ajout ou la suppression de attributs d'objet

var vm = new Vue({
  data: {
    a: 1
  }
})// `vm.a` 现在是响应式的vm.b = 2// `vm.b` 不是响应式的
Copier après la connexion

Mais nous pouvons ajouter des propriétés réactives aux objets imbriqués via la méthode Vue.set(object, key, value).
Il existe aussi cette méthode couramment utiliséeObject.assign() Lorsque nous voulons attribuer plusieurs nouveaux attributs à un objet, vous devez jouer comme ceci

this.userProfile = Object.assign({}, this.userProfile, {
  age: 27,
  favoriteColor: 'Vue Green'})
Copier après la connexion
<.>Pour plus de détails, voir : ici

Utilisez la méthode

dans v-formethods

<li v-for="n in even(numbers)">{{ n }}</li>
Copier après la connexion
Pour plus de détails, voir : ici

Composants utilisant

v-for

Dans les composants personnalisés, vous pouvez utiliser

comme n'importe quel élément normal. v-for

<my-component v-for="item in items" :key="item.id"></my-component>
Copier après la connexion
Pour plus de détails, voir : ici

Modificateurs d'événement (nouveau dans la version 2.1.4).once

<!-- 点击事件将只会触发一次 --><a v-on:click.once="doThis"></a>
Copier après la connexion

peut également être utilisé sur des .oncecomposants personnalisés.

Pour plus de détails, voir : ici

Fonctionnalitésis

En raison de certaines limitations de certains éléments dom eux-mêmes,

, <ul>, <ol>, <table> Il existe des restrictions sur les éléments autorisés dans un tel élément. <select>

<div id="app">  <table>    <money></money>  </table></div>Vue.component('txt',{
   template: '<div>I like money!</div>'})new Vue({
  el:'#app'})
Copier après la connexion
sera analysé dans le dom suivant

<div id="app">
  <div>I like money!</div>
  <table></table>
</div>
Copier après la connexion
Si vous souhaitez l'analyser correctement, vous devez utiliser le

attribut . is

<div id="app">
  <table>
    <tr is="money"></tr>
  </table>
</div>
Copier après la connexion
De cette façon, le dom est analysé correctement.

<div id="app">
  <table>
     <tbody>
        <div>I like money!</div>
     </tbody>
  </table>
</div>
Copier après la connexion

具体见:这里

将对象的所有属性作为 prop 进行传递

如果你想把一个对象的所有属性作为 prop 进行传递,可以使用不带任何参数的 v-bind (即用 v-bind 而不是 v-bind:prop-name)。例如,已知一个 todo 对象:

todo: {
  text: 'Learn Vue',
  isComplete: false}
Copier après la connexion

然后:

<todo-item v-bind="todo"></todo-item>
Copier après la connexion

将等价于:

<todo-item
  v-bind:text="todo.text"
  v-bind:is-complete="todo.isComplete"></todo-item>
Copier après la connexion

具体见: 这里

非 Prop 特性的替换与合并

  • classstyle这两个特性的值都会做合并 (merge) 操作

  • 其他属性(如: type) 则会进行覆盖

具体见: 这里

Props的一般绑定和动态绑定

我们常用的一般是动态绑定:

// 父组件<child :my-message="parentMsg"></child>new Vue({  data () {    return {
       parentMsg: '来自父组件的数据'
    }
  }
})// 子组件Vue.component('child', {  // 在 JavaScript 中使用 camelCase
  props: ['myMessage'],
  template: '<span>{{ myMessage }}</span>'})
Copier après la connexion

显示:

<span>来自父组件的数据</span>
Copier après la connexion

一般绑定:

// 父组件<!-- 在 HTML 中使用 kebab-case --><child my-message="hello!"></child>

子组件获得的是: 字符串 'hello!'
Copier après la connexion

具体见:这里

.sync 修饰符(2.3.0+新增)

之前在 2.0 版本中移除后,在 2.3.0 中又加上了,只是调用的逻辑发生了变化,变成了一种语法糖。
如下代码:

<comp :foo.sync="bar"></comp>
Copier après la connexion

会被扩展为:

<comp :foo="bar" @update:foo="val => bar = val"></comp>
Copier après la connexion

当子组件需要更新 foo 的值时,它需要显式地触发一个更新事件:

this.$emit('update:foo', newValue)
Copier après la connexion

有点类似与 v-model

具体见:这里

自定义组件的 v-model(2.2.0 新增)

默认情况下,一个组件的 v-model 会使用 value propinput 事件。这也是之前 v-model 默认绑定的元素 和 事件方法。

但是到 2.2.0 时候,我们可以通过 model 配置这个两个属性。

Vue.component('my-checkbox', {
  model: {
    prop: 'checked',    event: 'change'
  },
  props: {
    checked: Boolean,    // 这样就允许拿 `value` 这个 prop 做其它事了
    value: String
  },  // ...})
Copier après la connexion
<my-checkbox v-model="foo" value="some value"></my-checkbox>
Copier après la connexion

上述代码等价于:

<my-checkbox  :checked="foo"
  @change="val => { foo = val }"
  value="some value"></my-checkbox>
Copier après la connexion

具体见:这里

插槽内容分发

我们不总能遇见我们的组件中包含了哪些元素,这时候我们在开发组件的时候,需要让这部分内容自定义。
假定 my-component 组件有如下模板:

<div>
  <h2>我是子组件的标题</h2>
  <slot>
    只有在没有要分发的内容时才会显示。
  </slot>
</div>
Copier après la connexion

父组件模板:

<div>
  <h1>我是父组件的标题</h1>
  <my-component>
    <p>这是一些初始内容</p>
    <p>这是更多的初始内容</p>
  </my-component>
</div>
Copier après la connexion

渲染结果:

<div>
  <h1>我是父组件的标题</h1>
  <div>
    <h2>我是子组件的标题</h2>
    <p>这是一些初始内容</p>
    <p>这是更多的初始内容</p>
  </div>
</div>
Copier après la connexion

当然还有 具名插槽 、作用域插槽(2.1.0 新增)、slot-scope(2.5.0新增)

具体见:这里

动态组件

通过使用保留的 <component> 元素,并对其 is 特性进行动态绑定,你可以在同一个挂载点动态切换多个组件:

var vm = new Vue({
  el: '#example',
  data: {
    currentView: 'home'
  },
  components: {
    home: { /* ... */ },
    posts: { /* ... */ },
    archive: { /* ... */ }
  }
})
Copier après la connexion
<component v-bind:is="currentView">  <!-- 组件在 vm.currentview 变化时改变! --></component>
Copier après la connexion

注意这里的 is 与 之前说的 v-bind:is 别混淆

具体见:这里

对低开销的静态组件使用 v-once

尽管在 Vue 中渲染 HTML 很快,不过当组件中包含大量静态内容时,可以考虑使用 v-once 将渲染结果缓存起来,就像这样:

Vue.component('terms-of-service', {
  template: '\    <div v-once>\      <h1>Terms of Service</h1>\      ...很多静态内容...\    </div>\  '})
Copier après la connexion

具体见:这里

混合(mixins)的合并策略

周期钩子的合并策略

  • 同名钩子函数将混合为一个数组,因此都将被调用

  • 混合对象的钩子将在组件自身钩子 之前 调用

var mixin = {  created: function () {    console.log('混合对象的钩子被调用')
  }
}new Vue({
  mixins: [mixin],  created: function () {    console.log('组件钩子被调用')
  }
})// => "混合对象的钩子被调用"// => "组件钩子被调用"
Copier après la connexion

methods, components 和 directives 的合并策略

  • 两个对象键名冲突时,取组件对象的键值对

var mixin = {
  methods: {    foo: function () {      console.log('foo')
    },    conflicting: function () {      console.log('from mixin')
    }
  }
}var vm = new Vue({
  mixins: [mixin],
  methods: {    bar: function () {      console.log('bar')
    },    conflicting: function () {      console.log('from self')
    }
  }
})vm.foo() // => "foo"vm.bar() // => "bar"vm.conflicting() // => "from self"
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!