一 非单文件组件

组件不是一个单独的vue文件,同时多个组件定义在一个文件当中,这样的写法在实际开发中不常使用。
关于 VueComponent:
1、school组件本质上是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成
2、我们只需要写 的时候,使用这个组件,Vue 解析的时候,就会自动创建School组件的实例对象,即Vue执行了 new VueComponent(options)
3、每次调用Vue.extend,返回都是一个全新的 VueComponent
4、关于 this 指向:
(1)组件配置当中:data函数,methods中的函数,watch中的函数,computed中的函数,它们的指向均是【VC对象】
(2)new Vue(options)配置中:data函数,methods中的函数,watch中的函数,computed中的函数,是【VM对象】
5、VueComponent的实例对象,简称:vc。Vue的实例对象,简称:vm

  1. <!-- 容器,绑定vue -->
  2. <div id="app">
  3. <school></school>
  4. <hr>
  5. <student></student>
  6. <hr>
  7. <halo></halo>
  8. </div>
  9. <script>
  10. Vue.config.productionTip = false
  11. // 创建组件
  12. const school = Vue.extend({
  13. data() {
  14. return {
  15. schoolName: '麻省',
  16. schoolAddr: '广州'
  17. }
  18. },
  19. /**
  20. * 这里的template里面的标签需要使用一个div进行包裹起来
  21. */
  22. template: `
  23. <div>
  24. <h2>学校名称:{{ schoolName }}</h2>
  25. <h2>学校地址:{{ schoolAddr }}</h2>
  26. </div>
  27. `
  28. })
  29. // 创建组件
  30. const student = Vue.extend({
  31. data() {
  32. return {
  33. studentName: 'lz',
  34. studentAge: 19
  35. }
  36. },
  37. template: `
  38. <div>
  39. <h3>学生姓名:{{ studentName }}</h3>
  40. <h4>学生年龄 {{ studentAge }}</h4>
  41. </div>
  42. `
  43. })
  44. const halo = Vue.extend({
  45. template: `
  46. <div>你好!</div>
  47. `
  48. })
  49. // 全局注册组件的方式,会将当前这个组件注册进所有的VM实例对象当中
  50. Vue.component('halo', halo)
  51. // 第一步:创建vue对象
  52. const vm = new Vue({
  53. el: "#app",
  54. data: {
  55. name: "lz"
  56. },
  57. // 第二步:注册组件,将已经创建好的组件放在这里进行注册
  58. // 这里是 局部注册
  59. components: {
  60. school: school,
  61. student: student
  62. }
  63. })
  64. </script>

1.1 组件嵌套

  1. <!-- 容器,绑定vue -->
  2. <div id="app">
  3. <school></school>
  4. <hr>
  5. </div>
  6. <script>
  7. Vue.config.productionTip = false
  8. // 创建组件
  9. const student = Vue.extend({
  10. data() {
  11. return {
  12. studentName: 'lz',
  13. studentAge: 19
  14. }
  15. },
  16. template: `
  17. <div>
  18. <h3>学生姓名:{{ studentName }}</h3>
  19. <h4>学生年龄 {{ studentAge }}</h4>
  20. </div>
  21. `
  22. })
  23. // 创建组件
  24. const school = Vue.extend({
  25. data() {
  26. return {
  27. schoolName: '广工',
  28. schoolAddr: '广州'
  29. }
  30. },
  31. /**
  32. * 在 school 组件当中,注册进 student 组件
  33. * 然后在 div 中进行调用
  34. */
  35. template: `
  36. <div>
  37. <h2>学校名称:{{ schoolName }}</h2>
  38. <h2>学校地址:{{ schoolAddr }}</h2>
  39. <student></student>
  40. </div>
  41. `,
  42. components: {
  43. student
  44. }
  45. })
  46. // 第一步:创建vue对象
  47. const vm = new Vue({
  48. el: "#app",
  49. data: {
  50. name: "lz"
  51. },
  52. // 第二步:注册组件,将已经创建好的组件放在这里进行注册
  53. // 这里是 局部注册
  54. components: {
  55. school
  56. }
  57. })
  58. </script>

二 单文件组件

这里定义了很多个文件,在实际开发中常用
这些文件并不能直接被浏览器进行解析执行,需要放置在vue脚手架中才能进行读取

1丶main.js

  1. import App from './App'
  2. new Vue({
  3. el: '#app',
  4. components: {
  5. App
  6. },
  7. template: `<App></App>`,
  8. data() {
  9. return {}
  10. }
  11. })

2丶index.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>单文件组件语法</title>
  6. </head>
  7. <body>
  8. <!--
  9. 浏览器不能直接解析ES6语法
  10. -->
  11. <div id="app"></div>
  12. <script src="../../js/vue.js"></script>
  13. <script src="./main.js"></script>
  14. </body>
  15. </html>

3丶School.vue

  1. <template>
  2. <div>
  3. <h3>学校名称:{{ name }}</h3>
  4. <h3>学校地址:{{ addr }}</h3>
  5. <button @click="say"></button>
  6. </div>
  7. </template>
  8. <script>
  9. /**
  10. * 默认暴露,跟ES6的模块化有关系
  11. */
  12. export default {
  13. name: "School",
  14. data() {
  15. return {
  16. name: '广工',
  17. addr: '广州'
  18. }
  19. },
  20. methods: {
  21. say() {
  22. console.log('I from : ', this.name)
  23. }
  24. },
  25. component: {}
  26. }
  27. </script>
  28. <style scoped>
  29. </style>

4丶App.vue

  1. <template>
  2. <div>
  3. <School></School>
  4. </div>
  5. </template>
  6. <script>
  7. import School from './School'
  8. export default {
  9. name: "App",
  10. // 注册组件
  11. components: {
  12. School
  13. }
  14. }
  15. </script>
  16. <style scoped>
  17. </style>