Vue预习课09:可复用性.pdf

过滤器

过滤器使用filter. 过滤器是表示格式化数据的
过滤器分为全局过滤器和局部过滤器
过滤器的使用:
过滤器可以在插值语法中使用,也可以在v-bind表达式(属性绑定)中使用

| 是管道符号

  1. <div id="app">
  2. 不传前缀符号的局部过滤:{{money | preSymbol()}}
  3. 不传前缀符号的局部过滤:{{money | preSymbol}}
  4. <br/>
  5. 传前缀符号的局部过滤:{{money | preSymbol('$')}}
  6. <br/>
  7. 全局过滤:{{money | preSymbolG()}}
  8. <br/>
  9. 全局过滤11:{{money | preSymbolG('$')}}
  10. <div :title="money | preSymbolG('$')">在v-bind中使用</div>
  11. </div>
  12. // 全局过滤器(|符号的前一个值传入money)
  13. Vue.filter('preSymbolG', (money, symbol = "¥") => {
  14. return symbol + money;
  15. })
  16. new Vue({
  17. el: '#app',
  18. data: {
  19. money: 1234
  20. },
  21. // 局部过滤器
  22. filters: {
  23. // (|符号的前一个值传入money)
  24. preSymbol (money, symbol = "¥") {
  25. return symbol + money;
  26. }
  27. }
  28. })

自定义指令

自定义指令使用directive.
自定义指令一般是封装对DOM元素进行底层操作的方法,并且这个方法是需要复用的
更多的钩子函数需要在官方文档查看

  1. <div id="app">
  2. <!-- 无参数的自定义指令 -->
  3. <input type="text" v-model="inp" v-focus>
  4. <!-- 有参数的自定义指令 自定义指令后面是表达式 -->
  5. <button v-admin="{rooter: 'other'}">删除管理员</button>
  6. </div>
  7. // 自定义指令
  8. Vue.directive('focus', {
  9. inserted (el) {
  10. el.focus();
  11. }
  12. })
  13. // 通过自定义指令来操作元素
  14. Vue.directive('admin', {
  15. inserted (el, bindings) {
  16. console.log(bindings)
  17. console.log(bindings.value.rooter)
  18. if(bindings.value.rooter !== 'admin') {
  19. el.parentElement.removeChild(el);
  20. }
  21. }
  22. })
  23. new Vue({
  24. el: '#app',
  25. data: {
  26. inp: ''
  27. }
  28. })

渲染函数

作用:当程序更新的时候再次执行,得到最新的虚拟DOM
渲染函数使用render
render函数传入createdElement

  1. <script src="https://at.alicdn.com/t/font_2341569_n1zksf3dnza.js"></script>
  2. <style>
  3. .iconfont {
  4. font-family: "iconfont" !important;
  5. font-size: 16px;
  6. font-style: normal;
  7. -webkit-font-smoothing: antialiased;
  8. -moz-osx-font-smoothing: grayscale;
  9. }
  10. .icon {
  11. width: 1em;
  12. height: 1em;
  13. vertical-align: -0.15em;
  14. fill: currentColor;
  15. overflow: hidden;
  16. }
  17. </style>
  18. <div id="app">
  19. <h1 :title="title">
  20. <svg class="icon">
  21. <use xlink:href="#icon-shop"></use>
  22. </svg>
  23. {{title}}
  24. </h1>
  25. <heading leave="1" title="12331" icon="shop">{{title}}</heading>
  26. </div>
  27. Vue.component('heading', {
  28. props: {
  29. leave: {
  30. type: String,
  31. default: '1'
  32. },
  33. title: String,
  34. icon: String
  35. },
  36. render (h) {
  37. // 因为生成虚拟DOM的源码就是调用h的方法
  38. let children = [];
  39. if (this.icon) {
  40. const icon = h('svg', {
  41. attrs: {class: 'icon'},
  42. },
  43. [h('use', {
  44. attrs: {
  45. 'xlink:href': `#icon-${this.icon}`
  46. }
  47. })
  48. ])
  49. children.push(icon);
  50. }
  51. children = children.concat(this.$slots.default)
  52. console.log(this.$slots.default, children)
  53. return h(
  54. 'h'+this.leave,
  55. {
  56. attrs: {title: this.title}
  57. },
  58. children
  59. )
  60. }
  61. })
  62. new Vue({
  63. el: '#app',
  64. data: {
  65. title: '购物车'
  66. }
  67. })

虚拟DOM是真实DOM的映射,它是描述真实DOM的方式,它更轻量,快速

查看官方文档

函数式组件

如果组件没有监听器,没有data(没有响应式数据),没有生命周期,则可以使用函数式组件

函数式组件没有实例
函数式组件的使用没有响应式数据了,提高了性能(更加轻量,消耗资源更少)

查看官方文档

  1. <heading leave="1" title="12331" icon="shop">{{title}}</heading>
  2. // 函数式组件
  3. Vue.component('heading', {
  4. functional: true,
  5. props: {
  6. leave: {
  7. type: String,
  8. default: '1'
  9. },
  10. title: String,
  11. icon: String
  12. },
  13. render (h, context) {
  14. // 因为生成虚拟DOM的源码就是调用h的方法
  15. let children = [];
  16. let {icon, leave, title } = context.props;
  17. if (icon) {
  18. const iconVNode = h('svg', {
  19. attrs: {class: 'icon'},
  20. },
  21. [h('use', {
  22. attrs: {
  23. 'xlink:href': `#icon-${icon}`
  24. }
  25. })
  26. ])
  27. children.push(iconVNode);
  28. }
  29. children = children.concat(context.children)
  30. console.log(context.children, children)
  31. return h(
  32. 'h'+leave,
  33. {
  34. attrs: {title}
  35. },
  36. children
  37. )
  38. }
  39. })
  40. new Vue({
  41. el: '#app',
  42. data: {
  43. title: '购物车'
  44. }
  45. })

混入

混入使用mixin
混入是一种设计模式

混入式组件扩展,逻辑复用的一种方式

选项合并规则在官方文档中查看(插件开发和源码中会使用)

  1. <heading leave="1" title="12331" icon="shop">{{title}}</heading>
  2. // 混入中是一个对象
  3. const myMixin = {
  4. created() {
  5. this.hello();
  6. },
  7. methods: {
  8. hello () {
  9. console.log('hello')
  10. }
  11. }
  12. }
  13. Vue.component('heading', {
  14. props: {
  15. leave: {
  16. type: String,
  17. default: '1'
  18. },
  19. title: String,
  20. icon: String
  21. },
  22. // 混入,可以混入多个。如果组件内定义的函数名和数据名和混入定义的重复,则以组件中的为准
  23. mixins: [myMixin],
  24. render (h) {
  25. // 因为生成虚拟DOM的源码就是调用h的方法
  26. let children = [];
  27. if (this.icon) {
  28. const icon = h('svg', {
  29. attrs: {class: 'icon'},
  30. },
  31. [h('use', {
  32. attrs: {
  33. 'xlink:href': `#icon-${this.icon}`
  34. }
  35. })
  36. ])
  37. children.push(icon);
  38. }
  39. children = children.concat(this.$slots.default)
  40. console.log(this.$slots.default, children)
  41. return h(
  42. 'h'+this.leave,
  43. {
  44. attrs: {title: this.title}
  45. },
  46. children
  47. )
  48. }
  49. })
  50. new Vue({
  51. el: '#app',
  52. data: {
  53. title: '购物车'
  54. }
  55. })

插件

插件时vue扩展的终极方案
前面的几种方案不适合分发,即分享给别人
如果需要写vue的插件,则需要实现install方法
插件的使用Vue.use(插件)

Vue可以添加静态方法,申明指令或过滤器,或者混入,在混入中可以拿到组件实例,添加原型方法

  1. MyHeadering.js(插件)
  2. const MyHeadering = {
  3. install (Vue, options) {
  4. Vue.component('heading', {
  5. props: {
  6. leave: {
  7. type: String,
  8. default: '1'
  9. },
  10. title: String,
  11. icon: String
  12. },
  13. render (h) {
  14. // 因为生成虚拟DOM的源码就是调用h的方法
  15. let children = [];
  16. if (this.icon) {
  17. const icon = h('svg', {
  18. attrs: {class: 'icon'},
  19. },
  20. [h('use', {
  21. attrs: {
  22. 'xlink:href': `#icon-${this.icon}`
  23. }
  24. })
  25. ])
  26. children.push(icon);
  27. }
  28. children = children.concat(this.$slots.default)
  29. console.log(this.$slots.default, children)
  30. return h(
  31. 'h'+this.leave,
  32. {
  33. attrs: {title: this.title}
  34. },
  35. children
  36. )
  37. }
  38. })
  39. }
  40. }
  41. if(window !== undefined && window.Vue) {
  42. // 插件的使用
  43. window.Vue.use(MyHeadering)
  44. }
  45. 插件的使用
  46. <div id="app">
  47. <heading leave="1" title="12331" icon="shop">{{title}}</heading>
  48. </div>
  49. <script src="../vue.js"></script>
  50. <script src="plugin/headering.js"></script>
  51. <script>
  52. new Vue({
  53. el: '#app',
  54. data: {
  55. title: '购物车'
  56. }
  57. })
  58. </script>