Vue实战项目开发--深入理解vue组件

清疚 2022-05-23 13:22 318阅读 0赞

项目的源代码在GitHub上:点击查看

组件使用的细节点

  • 使用is属性解决模板标签上出现bug的情况
  • 在子组件定义data时,data必须是一个函数,而不能是一个对象(因为子组件会多次调用,每个子组件享用自己的数据,而不是像根组件享有一套数据,通过函数来返回数据,就是让每个子组件拥有独立的数据)
  • ref:可以在子组件上定义不同的ref,然后就可以通过引用来取得子组件的数据

    注意:另外的两个案例的代码在GitHub上

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>组件使用中的细节点</title>
  6. <script src="./vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="root">
  10. <table>
  11. <tbody>
  12. //通过is属性,让子组件显示出来,也满足h5的编码规范
  13. <tr is="row"></tr>
  14. <tr is="row"></tr>
  15. <tr is="row"></tr>
  16. </tbody>
  17. </table>
  18. </div>
  19. <script>
  20. Vue.component("row",{
  21. template: '<tr><td>this is row</td></tr>'
  22. })
  23. var vm =new Vue({
  24. el: "#root"
  25. })
  26. </script>
  27. </body>
  28. </html>

父子组件的数据传递

  • 父组件向子组件传值都是通过属性来传递的,子组件通过props来接受(单向数据流:子组件只能用父组件传递过来的参数,不能修改父组件传递过来的内容)
  • 子组件向父组件传值是通过事件的形式,把触发的事件向父组件传递

    <!DOCTYPE html>

    1. <meta charset="UTF-8">
    2. <title>父子组件的数据传递</title>
    3. <script src="./vue.js"></script>

    1. <div id="root">
    2. <counter :count="2" @inc="handleIncrease"></counter>
    3. <counter :count="3" @inc="handleIncrease"></counter>
    4. <div>{

    {total}}

    1. </div>
    2. <script>
  1. var counter = {
  2. props: ['count'],
  3. data: function () {
  4. return {
  5. number: this.count
  6. }
  7. },
  8. template: '<div @click="handleClick">{
  9. {number}}</div>',
  10. methods: {
  11. handleClick: function () {
  12. this.number = this.number + 2
  13. this.$emit('inc', 2)
  14. }
  15. }
  16. }
  17. var vm = new Vue({
  18. el: "#root",
  19. data: {
  20. total: 5
  21. },
  22. components: {
  23. counter: counter
  24. },
  25. methods: {
  26. handleIncrease: function (step) {
  27. this.total += step
  28. }
  29. }
  30. })
  31. </script>
  32. </body>
  33. </html>

组件参数校验与非props特性

required:确定父组件是否必须先向子组件传值

default:默认值,如果父组件没有向子组件传值,就显示默认值

validator:自定义校验器

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>组件参数校验与非props特性</title>
  6. <script src="./vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="root">
  10. <child content="hell"></child>
  11. </div>
  12. <script>
  13. Vue.component('child',{
  14. props: {
  15. content: {
  16. type: String,
  17. //required: false,
  18. //default: 'default value'
  19. validator: function (value) {
  20. return (value.length > 5)
  21. }
  22. }
  23. },
  24. template: '<div>{
  25. {content}}</div>'
  26. })
  27. var vm =new Vue({
  28. el: "#root"
  29. })
  30. </script>
  31. </body>
  32. </html>

非props特性:

  • 子组件没有定义props来接受父组件传递来的参数,就引起非props特性
  • 申明了一个非props特性,这个属性会展示在子组件的dom标签上

    <!DOCTYPE html>




    组件参数校验与非props特性










非父子组件间的传值

  • 可以通过vue的vuex框架实现非父子组件间的传值
  • 总线机制:发布-订阅模式

    <!DOCTYPE html>




    非父子组件间传值(Bus/总线/发布订阅模式/观察者模式)











注意:子组件不能直接改变父组件穿的值,不然会报错,因为要满足单向数据流

在Vue中使用插槽

  • 通过插槽,可更方便地向子组件传递dom元素,同时子组件使用这个插槽也很简单
  • 通过使用具名插槽,可以插入你想插入地内容
  • 作用域插槽:父组件调用子组件的时候,给子组件传了一个插槽(作用域插槽,这个插槽必须是template结尾的,还需要申明父组件接受子组件的数据放在那里的,还给子组件的模板的信息),当子组件做循环或者某一部分时,它的DOM结构由外部传递时

    <!DOCTYPE html>




    Vue中的插槽(slot)






    Dell







作用域插槽:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue中的作用域插槽(slot)</title>
  6. <script src="./vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="root">
  10. <child>
  11. <template slot-scope="props">
  12. <h1>{
  13. {props.item}}</h1>
  14. </template>
  15. </child>
  16. </div>
  17. <script>
  18. Vue.component('child',{
  19. data: function(){
  20. return {
  21. list: [1, 2, 3, 4]
  22. }
  23. },
  24. template: `<div>
  25. <ul>
  26. <slot v-for="item of list"
  27. :item=item
  28. >
  29. </slot>
  30. </ul>
  31. </div>`
  32. })
  33. var vm = new Vue({
  34. el: "#root"
  35. })
  36. </script>
  37. </body>
  38. </html>

动态组件和v-once指令

  • 通过componet可以实现动态组件效果,
  • v-once:可以提高静态资源的展示效率,并且把组件放在内存中

    <!DOCTYPE html>




    动态组件与v-once指令















发表评论

表情:
评论列表 (有 0 条评论,318人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Vue 开发

    Vue 组件化开发 什么叫做组件化 实例 什么叫做组件化 所谓组件化,就是把页面拆分成多个组件然后可重复利用,每个组件依赖的 CSS、JS、模板、图片

    相关 深入vue

    1.组件的引入 在组件声明的驼峰式命名的标签,被渲染到HTML里时,会改成-小写的形式(2.0以下版本),命名的时候要以-小写的形式命名。 ![20180501131909

    相关 VUE开发

    VUE组件开发 一、全局组件注册 二、局部组件注册 三、使用组件 四、组件的注意点 五、vue调试工具 六、父组件向子组件传值