5.13.1全局组件和局部组件

注册组件

组件的使用分成三个步骤:

   

创建组件构造器

注册组件

使用组件。

我们来看看通过代码如何注册组件

   

查看运行结果:

   

和直接使用一个div看起来并没有什么区别。

但是我们可以设想,如果很多地方都要显示这样的信息,我们是不是就可以直接使用来完成呢?

   

   

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Title</title>

<script src="../../js/vue.js"></script>

</head>

<body>

<div id="app">

{{msg}}

<!-- 3. 使用组件 -->

<my-cpn></my-cpn>

<my-cpn></my-cpn>

<my-cpn></my-cpn>

</div>

<script>

// 1. 创建组件构造器

const constr = Vue.extend({

template: `

<div>

<h2>我是标题</h2>

<h2>我是内容, 哈哈哈</h2>

</div>

`

});

// 2. 注册组件, 并且给组件命名

Vue.component('my-cpn', constr);

const vm = new Vue({

el: '#app',

data: {

msg: '你好'

},

methods: {}

});

</script>

</body>

</html>

   

   

这里的步骤都代表什么含义呢?

   

1.Vue.extend():

   

调用Vue.extend()创建的是一个组件构造器。

通常在创建组件构造器时,传入template代表我们自定义组件的模板。

该模板就是在使用到组件的地方,要显示的HTML代码。

事实上,这种写法在Vue2.x的文档中几乎已经看不到了,它会直接使用下面我们会讲到的语法糖,但是在很多资料还是会提到这种方式,而且这种方式是学习后面方式的基础。

2.Vue.component():

   

调用Vue.component()是将刚才的组件构造器注册为一个组件,并且给它起一个组件的标签名称。

所以需要传递两个参数:1、注册组件的标签名 2、组件构造器

3.组件必须挂载在某个Vue实例下,否则它不会生效。

   

我们来看下面我使用了三次<my-cpn></my-cpn>

而第三次其实并没有生效:

   

   

组件其他补充

全局组件和局部组件

   

当我们通过调用Vue.component()注册组件时,组件的注册是全局的

这意味着该组件可以在任意Vue示例下使用。

如果我们注册的组件是挂载在某个实例中, 那么就是一个局部组件:

   

   

   

踩坑:

  1. 组件里只能有一个根标签(先写一个div然后把所有内容包起来)
  2. 给组件命名的时候一定要用xx-xx的方式, 用驼峰会使Vue无法识别. 上图里的2个组件在代码中的名字是: 'my-cpn'和'my-poem' 

代码:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Title</title>

<script src="../../js/vue.js"></script>

</head>

<body>

<div id="vm">

{{msg}}

<!-- 3. 使用组件 -->

<my-cpn></my-cpn>

<my-cpn></my-cpn>

<my-cpn></my-cpn>

</div>

<div id="app">

{{msg}}

<div>

<my-poem></my-poem>

</div>

</div>

<script>

// 1. 创建组件构造器

const constr = Vue.extend({

template: `

<div>

<h2>我是标题</h2>

<h2>我是内容, 哈哈哈</h2>

</div>

`

});

   

const poem = Vue.extend({

template: `

<div>

<h2>肛好遇见你</h2>

<h2>作者: 我是你爹</h2>

</div>

`

});

   

// 2. 注册全局组件(Vue实例可以不止一个, 全局组件可以给多个使用), 并且给组件命名: 名字要用''引号括起来, 并且坚决不能使用驼峰, 单词之间用-相连

Vue.component('my-cpn', constr);

const vm = new Vue({

el: '#vm',

data: {

msg: '你好'

},

methods: {}

});

const app = new Vue({

el: '#app',

data: {

msg: '你谁啊?'

},

methods: {},

// 局部组件, 只能在id="app"的div里使用.

components: {

'my-poem': poem

}

});

</script>

</body>

</html>

猜你喜欢

转载自www.cnblogs.com/edfg/p/12708552.html
今日推荐