1、组件的定义
一般将 Vue 组件定义在一个单独的 .vue
文件中,称做单文件组件;当然也可以将组件直接定义在js文件中,如下js代码,定义一个组件BlogPost,通过props定义对外暴露属性title,父组件传递title,子组件根据title渲染html内容。
export default {props: ['title'],template: `<div class="blog-post"><h4>{{ title }}</h4></div>`
}
2、组件的使用
首先需要引用组件,语法格式import BlogPost from './BlogPost.js',然后在vue应用对象中注册组件,在components区域注册即可,最后在DOM元素内部使用标签格式,如代码<blog-post title="My jouney with Vue"></blog-post>应用子组件,并传递title属性给子组件渲染。
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<div id="app"><blog-post title="My jouney with Vue"></blog-post>
</div>
<script type="module">import BlogPost from './BlogPost.js'const { createApp } = Vue;createApp({components: {BlogPost},}).mount('#app');
</script>
3、组件的重复应用
可以使用v-for语法循环创建子组件,如代码所示:
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<div id="app"><blog-post v-for="post in posts" :key="post.id" :title="post.title"></blog-post>
</div>
<script type="module">import BlogPost from './BlogPost.js'const { createApp } = Vue;createApp({data() {return {posts: [{ id: 1, title: 'My jounery with Vue' },{ id: 2, title: 'Blogging with Vue' },{ id: 3, title: 'Why Vue is so fun' }]}},components: {BlogPost}}).mount('#app');
</script>
4、给组件传递事件
组件中模板声明一个按钮,并使用@click绑定点击事件,使用$emit抛出一个事件名为enlarge-text,并通过emits定义对外抛出的事件名称enlarge-text,定义如下代码所示:
export default {props: ['title'],emits: ['enlarge-text'],template: `<div class="blog-post"><h4>{{ title }}</h4><button @click="$emit('enlarge-text')">Enlarge text</button></div>`
}
应用组件,应用中定义字体大小属性postFontSize,在组件blog-post应用的代码处定义事件@enlarge-text="postFontSize+=0.1",点击后触发字体+0.1:
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<div id="app"><div :style="{ fontSize: postFontSize + 'em' }"><blog-post v-for="post in posts" :key="post.id" :title="post.title" @enlarge-text="postFontSize+=0.1"></blog-post></div>
</div>
<script type="module">import BlogPost from './BlogPost.js'const { createApp } = Vue;createApp({data() {return {posts: [{ id: 1, title: 'My jounery with Vue' },{ id: 2, title: 'Blogging with Vue' },{ id: 3, title: 'Why Vue is so fun' }],postFontSize:1}},components: {BlogPost},mounted() {}}).mount('#app');
</script>
5、插槽的应用
在组件中定义一个插槽,模板中语法<slot/>,
export default {template: `<div class="alert-box"><strong>This is an Error for Demo Purpose</strong><slot/></div>`
}
在vue应用中给插槽传递html内容,alert-box元素中的内容“Something bad happened.”将传递给组件的插槽:
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<div id="app"><alert-box>Something bad happened.</alert-box><table><tr><td>123</td><td>456</td></tr><tr is="vue:alert-box"></tr></table>
</div>
<script type="module">import AlertBox from './AlertBox.js'const { createApp } = Vue;createApp({data() {return {}},components: {AlertBox}}).mount('#app');
</script>