vue2 几个非常好用的小技巧

Watchers

1、普通监听

watch选项还支持以点分隔的路径作为键

export default {
  watch: {
    // Note: only simple paths. Expressions are not supported.
    'some.nested.key'(newValue) {
      // ...
    }
  }
}

2、Deep Watchers 深度 监听

默认情况下,watch是浅层的:回调只会在被监视的属性被分配了一个新值时触发——它不会在嵌套属性更改时触发。如果你想对所有嵌套的突变触发回调,你需要使用深度监视

export default {
  watch: {
    someObject: {
      handler(newValue, oldValue) {
        
      },
      deep: true
    }
  }
}

深度监视需要遍历被监视对象中的所有嵌套属性,在大型数据结构上使用时成本可能会很高。仅在必要时使用,并注意性能影响。

3、Eager Watchers 热切观察者

默认情况下,watch是惰性的:在被监视的源发生更改之前,不会调用回调。但在某些情况下,我们可能希望急切地运行相同的回调逻辑——例如,我们可能希望获取一些初始数据,然后在相关状态发生变化时重新获取数据。
我们可以通过使用带有处理函数的对象和immediate:true选项声明观察者的回调来强制立即执行它:

export default {
  watch: {
    question: {
      handler(newQuestion) {
        
      },
      // force eager callback execution
      immediate: true
    }
  }
}

4、Callback Flush Timing

当您改变反应状态时,它可能会触发您创建的Vue组件更新和观察者回调。
默认情况下,在Vue组件更新之前调用用户创建的观察者回调。这意味着,如果试图在watcher回调中访问DOM,则DOM将处于Vue应用任何更新之前的状态。
如果要在Vue更新DOM后在watcher回调中访问它,则需要指定flush:“post”选项:

export default {
  watch: {
    key: {
      handler() {},
      flush: 'post'
    }
  }
}

5、this.$watch()

还可以使用$watch()实例方法强制创建观察者:

export default {
  created() {
    this.$watch('question', (newQuestion) => {
      
    })
  }
}

Template Refs

<input ref="input">
<script>
export default {
  mounted() {
    this.$refs.input.focus()
  }
}
</script>

<template>
  <input ref="input" />
</template>

引用的实例将与子组件的this相同,这意味着父组件将拥有对子组件的每个属性和方法的完全访问权限。这使得在父级和子级之间创建紧密耦合的实现细节变得容易,因此组件引用应该只在绝对需要时使用——在大多数情况下,您应该首先尝试使用标准道具和发射接口实现父/子级交互。
expose选项可用于限制对子实例的访问:

export default {
  expose: ['publicData', 'publicMethod'],
  data() {
    return {
      publicData: 'foo',
      privateData: 'bar'
    }
  },
  methods: {
    publicMethod() {
      /* ... */
    },
    privateMethod() {
      /* ... */
    }
  }
}

slot 插槽

1、普通插槽

2、具名插槽

<div class="container">
  <header>
    <slot name="header"></slot>
  </header>
  <main>
    <slot></slot>
  </main>
  <footer>
    <slot name="footer"></slot>
  </footer>
</div>

使用方法一

<BaseLayout>
  <template v-slot:header>
    <!-- content for the header slot -->
  </template>
</BaseLayout>

方法二、

3、 动态插槽名称

<base-layout>
  <template v-slot:[dynamicSlotName]>
    ...
  </template>

  <!-- with shorthand -->
  <template #[dynamicSlotName]>
    ...
  </template>
</base-layout>

4、 作用域插槽

如渲染范围中所述,插槽内容无权访问子组件中的状态。
然而,在某些情况下,如果槽的内容可以同时使用父范围和子范围中的数据,那么它可能会很有用。为了实现这一点,我们需要一种方法,让孩子在渲染数据时将数据传递到插槽。
事实上,我们可以做到这一点-我们可以将属性传递给插槽插座,就像将道具传递给组件一样:

<div>
  <slot :text="greetingMessage" :count="1"></slot>
</div>

当使用单个默认插槽与使用命名插槽时,接收插槽道具有点不同。我们将首先展示如何使用单个默认插槽接收,直接在子组件标签上使用v形插槽:

<!-- <MyComponent> template -->
<MyComponent v-slot="slotProps">
  {{ slotProps.text }} {{ slotProps.count }}
</MyComponent>

也可以使用解構的方法

<MyComponent v-slot="{ text, count }">
  {{ text }} {{ count }}
</MyComponent>

5 具名插槽

命名作用域插槽的工作原理类似——插槽道具可以作为v-slot指令的值进行访问:v-slot:name=“slotProps”。

<MyComponent>
  <template #header="headerProps">
    {{ headerProps }}
  </template>

  <template #default="defaultProps">
    {{ defaultProps }}
  </template>

  <template #footer="footerProps">
    {{ footerProps }}
  </template>
</MyComponent>
posted @ 2022-04-18 21:04  boygdm  阅读(292)  评论(0编辑  收藏  举报