Vue预习课07:vue必会API盘点 (1).pdf

数据相关

Vue.set

向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新。

对于没有响应式的数据,进行数据的双向绑定。例如:没有在data中初始化声明的数据,后期添加的数据,就不是响应式的数据

使用方法:Vue.set(target, propertyName/index, value)
vm.$set(target, propertyName/index, value)

  1. <!-- input中会以字符串的形式,传输到数据中,这里需要加修饰符.number,将来这个值会转换成数字-->
  2. <p><input type="text" v-model.number="price"><button @click="batchPrice">批量更新价格</button></p>
  3. <div>
  4. <p v-if="courses.length == 0">暂无课程数据</p>
  5. <ul v-else>
  6. <li v-for="item in courses" :key="item.name" :class="{active: item.name === selectedCourse}" @click="selectedCourse = item.name">{{item.name}} -- ¥{{item.price}}</li>
  7. </ul>
  8. </div>
  9. // 将vue绑定到宿主元素中
  10. // 1.创建vue实例
  11. const app = new Vue({
  12. el: '#app',
  13. data: {
  14. courses: [{name: '大数据'}, {name: ' web'}]
  15. price: 0
  16. },
  17. created () {
  18. this.batchPrice();
  19. },
  20. methods: {
  21. // 批量更新价格
  22. batchPrice () {
  23. this.courses.forEach(item => {
  24. // 使用下面的写法价格不会被批量更新,因为price不是响应式的数据
  25. // item.price = this.price;
  26. // 两种方式调用
  27. this.$set(item, 'price', this.price)
  28. // Vue.set(item, 'price', this.price)
  29. // this.$set是Vue.set的别名
  30. })
  31. }
  32. }
  33. })

Vue.delete

删除响应式的数据。如果使用delete 属性的方式来删除响应式的数据的话,页面是不会被重新渲染的(即监听不到数据的删除)
有两种使用方式

  1. Vue.delete(target, propertyName/index)
  2. this.$delete(target, propertyName/index)
  3. // vm.$delete是Vue.delete的别名

事件相关的API

vm.$on

vm表示vue的实例,或者是组件的实例
事件监听
这个如果是写在模板中的话,则会写成@名称="函数/表达式"

  1. // 如果写在模板中,则写成
  2. // @test="callback"
  3. // 编程的方式来写
  4. vm.$on('test', (msg) => {
  5. console.log(msg)
  6. })

事件的派发者和监听者是同一个实例

vm.$emit

派发事件

  1. this.$emit('test', 'param')

vm.$once

事件只监听一次
监听一个自定义事件,但是只触发一次。一旦触发之后,监听器就会被移除

  1. vm.$once('test', (msg) => {
  2. console.log(msg)
  3. })

vm.$off

移出事件监听

  1. this.$off() // 移除当前实例所有的监听
  2. this.$off('test') // 移除该事件的所有监听
  3. this.$off('test', callback) // 移除该事件的回调的监听

典型的应用:事件总线的案例

事件的监听者和派发者必须是同一个组件

  1. <!-- 提示 -->
  2. <!-- 默认插槽 -->
  3. <message :show="show" @close="show = $event">新增成功</message>
  4. <!-- 修饰符sync的使用 -->
  5. <message2 :show2="show2" @update:show2="show2 = $event">新增成功</message2>
  6. // 派发事件总线
  7. <button @click="$bus.$emit('clear')">清除全部的提示</button>
  8. // 设置事件总线,为了在任意组件中可以访问到$bus
  9. Vue.prototype.$bus = new Vue();
  10. // 提示框 --- 默认插槽
  11. Vue.component('message', {
  12. props: ['show'],
  13. mounted () {
  14. // 监听事件总线
  15. this.$bus.$on('clear', () => {
  16. this.$emit('close', false);
  17. })
  18. },
  19. template: `
  20. <div v-if="show">
  21. <slot>默认提示</slot>
  22. <span @click="$emit('close', false)">×</span>
  23. </div>
  24. `
  25. })
  26. // 提示框 --- 默认插槽 -- 修饰符sync的使用
  27. Vue.component('message2', {
  28. props: ['show2'],
  29. mounted () {
  30. // 监听事件总线
  31. this.$bus.$on('clear', () => {
  32. this.$emit('update:show2', false);
  33. })
  34. },
  35. template: `
  36. <div v-if="show2">
  37. <slot>默认提示</slot>
  38. <span @click="$emit('update:show2', false)">×</span>
  39. </div>
  40. `
  41. })
  42. const app = new Vue({
  43. el: '#app',
  44. data: {
  45. title: '购物车',
  46. list: [{name: '大数据'}, {name: ' web'}],
  47. course: '',
  48. price: 0,
  49. show: false,
  50. show2: false
  51. },
  52. created () {
  53. this.batchPrice();
  54. },
  55. methods: {
  56. addCourse () {
  57. this.list.push({name: this.course});
  58. this.course = '';
  59. this.show = true;
  60. this.show2 = true;
  61. }
  62. }
  63. })

节点引用的API

组件或元素引用(使用ref和vm.$refs)

例如获取焦点事件

  1. <input type="text" ref="inp" />
  2. mounted () {
  3. // mounted之后才能访问到ref
  4. this.$refs.inp.focus()
  5. }

如果ref写在普通的DOM元素上,获取的是DOM元素。ref写在组件(包括子组件)上,获取的是组件的实例

ref放在组件上的实例

  1. <!-- 默认插槽 -->
  2. <message ref="message">新增成功</message>
  3. // 提示框 --- 默认插槽
  4. Vue.component('message', {
  5. data () {
  6. return {
  7. show: false
  8. }
  9. },
  10. methods: {
  11. toggle () {
  12. this.show = !this.show
  13. }
  14. },
  15. template: `
  16. <div v-if="show">
  17. <slot>默认提示</slot>
  18. </div>
  19. `
  20. })
  21. // 将vue绑定到宿主元素中
  22. // 1.创建vue实例
  23. const app = new Vue({
  24. el: '#app',
  25. data: {
  26. title: '购物车',
  27. list: [{name: '大数据'}, {name: ' web'}],
  28. course: ''
  29. }
  30. mounted: {
  31. this.$refs.message.toggle();
  32. }
  33. })
  • ref是作为渲染结果被创建的,则在初始渲染的时候是不能访问他们的,则至少在mounted中访问(在created和beforecreated中无法访问)
  • $refs不是响应式的,不要试图用他在模板中做数据绑定
  • 当v-for用于元素或组件时,引用信息将时包含DOM节点或数组实例的数组。 ```javascript
    • {{item}}

mounted() { console.log(this.$refs.li) } ```