Vue.js学习笔记——16.单文件组件
初识
在之前Vue-CLI创建的项目中,看到了新的文件扩展名.vue,称为,是Vue.js自定义的一种文件格式。 在之前的代码中,编写组件的形式都是全局组件,全部逻辑写在一个HTML文件内,这种方式虽然在初步学习的时候方便,但当我们的代码逻辑慢慢复杂,或想要编写更大的项目的时候,就会暴露出很多缺点。 单文件组件的出现很好的解决了这些问题,打开项目中的根组件App.vue可以看到.vue文件由三部分组成:<template>、<style>、<script>
<!-- App.vue --> <template> <div id="app"> <img alt="Vue logo" src="./assets/logo.png"> <HelloWorld msg="Welcome to Your Vue.js App"/> </div> </template> <script> import HelloWorld from ./components/HelloWorld.vue export default { name: App, components: { HelloWorld } } </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
components文件夹下的HelloWorld.vue也是如此,编写子组件时在<template>中编写模板,<script>中导出组件配置,<style>中编写组件样式,然后在父组件中导入引入即可。
上手
接下来我们自己写一个单文件组件。首先把components文件夹下的HelloWorld.vue删除,并且将App.vue内的HelloWorld.vue相关代码删除,简化App.vue
<template> <div id="app"> <img alt="Vue logo" src="./assets/logo.png"> </div> </template> <script> export default { name: App, components: { } } </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
在components下创建一个MyCpn.vue文件,往<template>中添加div代码,往<script>中添加Vue实例代码,往<style>中添加组件样式代码。如:
<!-- MyCpn.vue --> <template> <p>{ {msg}},{ {name}}</p> </template> <script> export default { data() { return { msg:Hello } }, props:{ name:String } } </script> <style> p { font-size: 50px; } </style>
需注意: 1.template内部需要有唯一根节点 2.script内部主要是通过es6模块化导出一个对象,内部成员完全参考Vue实例 3.单文件组件里面的data必须写成函数形式,vue中组件是用来复用的,这是为了防止多个组件实例对象之间共用一个 data ,产生数据污染。 4.当<style>标签有 scoped 属性时,它的 CSS 只作用于当前组件中的元素。
<script> export default { data() { return { // 此处定义变量 } }, props:{ }, cpompoents:{ } } </script> <style scoped> /* 此处的CSS只作用于当前组件 */ p { color: red; } </style>
接下来,在App.vue的<script>中导入并引用文件,在<template>中使用组件
<template> <div id="app"> <img alt="Vue logo" src="./assets/logo.png"> <!-- 使用组件 --> <my-cpn name="marmot"></my-cpn> </div> </template> <script> // 导入MyCpn import MyCpn from ./components/MyCpn.vue export default { name: App, // 引入组件 components: { MyCpn } } </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
运行项目,即可看到组件已经渲染成功