组件

组件
  • 组件化思维
    组件化针对的是页面中的整个完整的功能模块划分 (项目的分工)
  • 组件的概念( 一个文件 )
    组件是一个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 返回值, 并且返回值是一个对象
    组件的数据在组件的模板中使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值