欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

组件

程序员文章站 2022-05-13 20:54:10
...

组件

  • 组件化思维
    组件化针对的是页面中的整个完整的功能模块划分 (项目的分工)
  • 组件的概念( 一个文件 )
    组件是一个html、css、js、image等外链资源,这些部分组成的一个聚合体
    优点:代码复用,便于维护
    划分组件的原则:复用率高的,独立性强的

组件命名建议使用两种方式
使用 kebab-case
举例
Vue.component(‘header-title’,{})
使用 PascalCase
举例:
Vue.component(‘MyComponentName’, { /* … */ })
解释: 为什么要是上面两种写法 ? 为了区别html的原生标签
组件的嵌套
template
组件根元素唯一
data选项

为什么组件使用必须注册?

  1. vue.js文件中暴露出一个Vue的构造器函数, 这个函数的作用,是用来实例化出来一个实例, 那么这个实例也是一个组件, 我们称之为 ‘根实例’
  2. 我们从vue detools中我们发现这个实例的表现形式是一个标签
  3. Vue为了扩展功能, 给了一个方法 , 这个方法叫 extend
  4. 我们对比 Vue vs Vue.extend() 我们发现这两个方法输出结果都是两个构造器函数, 并且很相似
  5. 那么我们进一步得到一个结果: 使用方法一致吗?
  • new Vue.extend() 报错 不需要进行实例化 , 它希望组件的表现形式应该是标签
  • 要想像标签一样使用, 必须准守 h5 的标准 , 也就是说组件必须合法 , 要想合法, 必须注册(登记)
  • 组件使用前必须注册

组件的注册有两种方式

  1. 全局注册
  2. 局部注册
    注意:
    全局 和 局部 指的范围
以下是全局注册和局部注册的标准写法

全局注册

<body>
        <div id="app">
              <Hello></Hello>
              <Hello/>
       </div>
       <div id="app1">
              <Hello></Hello>
       </div>
</body>
<script>

/* Vue.extend({
template: 模板,
data(){},
mthods: {},
watch: {},
computed:{}
}) */
var Hello = Vue.extend({
template: '<div> hello component </div>'
})
// 全局注册: Vue.component(组件名,组件的配置项)
Vue.component('Hello',Hello)
new Vue({
      el: '#app',
})
new Vue({
     el: '#app1',
})
</script>

局部注册

<body>
       <div id="app">
          <Hello></Hello>
          <Hello/>
      </div>
      <div id="app1">
          <Hello></Hello>
      </div>
</body>
<script>

var Hello = Vue.extend({
         template: '<div> hello component </div>'
})
new Vue({
       el: '#app',
      components: {
           'Hello': Hello
      }
})
</script>

以下是全局注册和局部注册的简写

全局注册
Vue.component(组件名称, 组件的配置项)


Vue.component('Hello',{
           template: '<h3> Hello 全局注册</h3>',
           computed: {
            },
           methods: {
            },
           watch: {
            }
})

局部注册

new Vue({
      el: '#app',
     components: {
            'hello-yyb': {
                 template: '<div> hello 骏哥今天干吗去了 </div>'
                }
           }
})

组件的嵌套

全局注册的嵌套

<body>
        <div id="app">
           <Father></Father>
        </div>
</body>
<script>
/*
<Father>
<Son></Son>
</Father>
上面写法是错的 why? 组件的渲染内容是由配置项 template决定的
正确写法:
将子组件以标签的形式放在父组件的tempalte选项中
*/
Vue.component('Father',{
           template: '<h3> father <Son></Son> </h3>'
})
Vue.component('Son',{
          template: '<h3> son </h3>'
})
new Vue({
      el: '#app',
})
</script>

局部注册的嵌套

<body>
         <div id="app">
             <Father></Father>
         </div>
</body>
<script>
/*
总结:
组件嵌套: 局部注册形式
子组件必须在父组件中注册之后才能在父组件的模板中使用
*/
new Vue({
       el: '#app',
       components: {
       'Father': {
           template: '<div> father <Son/> </div>',
      components: {
         'Son': {
           template: '<h3> Son </h3>'
            }
         }
    }
 }
})
</script>
</html>

template外用

<body>
       <div id="app">
              <Hello></Hello>
       </div>
<template id="Hello">
       <div class="content">
           <ul>
                <li><a href="">你好</a></li>
                <li><a href="">你好</a></li>
                <li><a href="">你好</a></li>
          </ul>
      </div>
</template>
</body>
<script>
Vue.component('Hello',{
          template: '#Hello'
})
new Vue({
          el: '#app',
})
</script>
组件模板的根元素唯一
<body>
            <div id="app">
                <Hello></Hello>
               <template>
                    <div> 第一个template </div>
               </template>
           </div>
<template id="Hello">
          <div>
                <div> 这是hello 组件的template </div>
                <div> 这是hello 组件的template </div>
                <div> 这是hello 组件的template </div>
                <div> 这是hello 组件的template </div>
          </div>
</template>
</body>
<script>
Vue.component('Hello',{
          template: '#Hello'
})
new Vue({
          el: '#app',
})
</script>

总结:

  1. 组件的template如果body里面的话,一定记住要放在 #app 的div外
  2. 组件的template在body中使用的话, 是不会解析的, 但是组件内的template是会解析的
  3. 组件的模板中的直接子元素必须有一个, 如果你要有多个, 必须使用v-if v-else-if

组件data选项

<body>
            <div id="app">
                <Hello/>
            </div>
       <template id="Hello">
              <div>
                  {{ msg }}
              </div>
       </template>
</body>
<script>
Vue.component('Hello',{
           template: '#Hello',
         data(){
               return {
                       msg: 'hello 骏哥'
                   }
             }
   })
new Vue({
          el: '#app',
          data: {}
})
</script>

根实例中的data选项是一个对象, 但是组件中的data选项是一个函数, why?
解释:
函数的作用:

  1. 函数有独立作用域
  2. 函数可以有return 返回值 ,
    组件的data选项必须有return 返回值, 并且返回值是一个对象
    组件的数据在组件的模板中使用
相关标签: 组件