• Vue复习7:组件化编程,关于VueComponent,非单文件组件,单文件组件


    模块与组件、模块化与组件化

    组件:实现应用中局部功能代码(css html js)和资源(mp34 ttf .zip)的集合

    作用:复用编码, 简化项目编码, 提高运行效率

    模块:向外提供特定功能的 js 程序, 一般就是一个 js 文件

    作用:复用 js, 简化 js 的编写, 提高 js 运行效率

    模块化当应用中的 js 都以模块来编写的, 那这个应用就是一个模块化的应用

    组件化:当应用中的功能都是多组件的方式来编写的, 那这个应用就是一个组件化的应用。

     

    非单文件组件:一个文件中包含N个组件

    Vue中使用组件的三大步骤:

    一、定义组件(创建组件)

    二、注册组件

    三、使用组件(写组件标签)

    一、如何定义一个组件?

    使用Vue.extend(options)创建,其中options和new Vue(options)时传入的那个options几乎一样,但也有点区别

    区别如下:

    1.el不要写,为什么? ——— 最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器。

    2.data必须写成函数,为什么? ———— 避免组件被复用时,数据存在引用关系。

    备注:使用template可以配置组件结构。

    二、如何注册组件?

    1.局部注册:靠new Vue的时候传入components选项

    2.全局注册:靠Vue.component('组件名',组件)

    三、编写组件标签

    <school></school>

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title>基本使用</title>
    6. <script type="text/javascript" src="../../js/vue.js"></script>
    7. </head>
    8. <body>
    9. <!-- 准备好一个容器-->
    10. <div id="root">
    11. <hello></hello>
    12. <hr>
    13. <h1>{{msg}}</h1>
    14. <hr>
    15. <!-- 第三步:编写组件标签 -->
    16. <school></school>
    17. <hr>
    18. <!-- 第三步:编写组件标签 -->
    19. <student></student>
    20. </div>
    21. <div id="root2">
    22. <hello></hello>
    23. </div>
    24. </body>
    25. <script type="text/javascript">
    26. Vue.config.productionTip = false
    27. //第一步:创建school组件
    28. const school = Vue.extend({
    29. template:`
    30. <div class="demo">
    31. <h2>学校名称:{{schoolName}}</h2>
    32. <h2>学校地址:{{address}}</h2>
    33. <button @click="showName">点我提示学校名</button>
    34. </div>
    35. `,
    36. // el:'#root', //组件定义时,一定不要写el配置项,
    37. //因为最终所有的组件都要被一个vm管理,由vm决定服务于哪个容器。
    38. data(){
    39. return {
    40. schoolName:'zt',
    41. address:'长沙'
    42. }
    43. },
    44. methods: {
    45. showName(){
    46. alert(this.schoolName)
    47. }
    48. },
    49. })
    50. //第一步:创建student组件
    51. const student = Vue.extend({
    52. template:`
    53. <div>
    54. <h2>学生姓名:{{studentName}}</h2>
    55. <h2>学生年龄:{{age}}</h2>
    56. </div>
    57. `,
    58. data(){
    59. return {
    60. studentName:'张三',
    61. age:18
    62. }
    63. }
    64. })
    65. //第一步:创建hello组件
    66. const hello = Vue.extend({
    67. template:`
    68. <div>
    69. <h2>你好啊!{{name}}</h2>
    70. </div>
    71. `,
    72. data(){
    73. return {
    74. name:'Tom'
    75. }
    76. }
    77. })
    78. //第二步:全局注册组件
    79. Vue.component('hello',hello)
    80. //创建vm
    81. new Vue({
    82. el:'#root',
    83. data:{
    84. msg:'你好啊!'
    85. },
    86. //第二步:注册组件(局部注册)
    87. components:{
    88. school,
    89. student
    90. }
    91. })
    92. new Vue({
    93. el:'#root2',
    94. })
    95. </script>
    96. </html>

    组件的几个注意点:

    1.关于组件名:

    一个单词组成:

    第一种写法(首字母小写):school

    第二种写法(首字母大写):School

    多个单词组成:

    第一种写法(kebab-case命名):my-school

    第二种写法(CamelCase命名):MySchool (需要Vue脚手架支持)

    备注:

    (1).组件名尽可能回避HTML中已有的元素名称,例如:h2、H2都不行。

    (2).可以使用name配置项指定组件在开发者工具中呈现的名字。

    2.关于组件标签:

    第一种写法:<school></school>

    第二种写法:<school/>

    备注:不用使用脚手架时,<school/>会导致后续组件不能渲染。

    3.一个简写方式:

    const school = Vue.extend(options) 可简写为:const school = options

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title>几个注意点</title>
    6. <script type="text/javascript" src="../../js/vue.js"></script>
    7. </head>
    8. <body>
    9. <div id="root">
    10. <h1>{{msg}}</h1>
    11. <school></school>
    12. </div>
    13. </body>
    14. <script type="text/javascript">
    15. Vue.config.productionTip = false
    16. //定义组件
    17. const s = Vue.extend({
    18. name:'Vue呈现',
    19. template:`
    20. <div>
    21. <h2>学校名称:{{name}}</h2>
    22. <h2>学校地址:{{address}}</h2>
    23. </div>
    24. `,
    25. data(){
    26. return {
    27. name:'zt',
    28. address:'长沙'
    29. }
    30. }
    31. })
    32. //简写:
    33. const ss= {
    34. name:'Vue呈现',
    35. template:`
    36. <div>
    37. <h2>学校名称:{{name}}</h2>
    38. <h2>学校地址:{{address}}</h2>
    39. </div>
    40. `,
    41. data(){
    42. return {
    43. name:'zt',
    44. address:'长沙'
    45. }
    46. }
    47. }
    48. new Vue({
    49. el:'#root',
    50. data:{
    51. msg:'学习Vue!'
    52. },
    53. components:{
    54. school:s
    55. }
    56. })
    57. </script>
    58. </html>

    组件的嵌套

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title>组件的嵌套</title>
    6. <!-- 引入Vue -->
    7. <script type="text/javascript" src="../../js/vue.js"></script>
    8. </head>
    9. <body>
    10. <!-- 准备好一个容器-->
    11. <div id="root">
    12. </div>
    13. </body>
    14. <script type="text/javascript">
    15. Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
    16. //定义student组件
    17. const student = Vue.extend({
    18. name:'student',
    19. template:`
    20. <div>
    21. <h2>学生姓名:{{name}}</h2>
    22. <h2>学生年龄:{{age}}</h2>
    23. </div>
    24. `,
    25. data(){
    26. return {
    27. name:'zt',
    28. age:18
    29. }
    30. }
    31. })
    32. //定义school组件
    33. const school = Vue.extend({
    34. name:'school',
    35. template:`
    36. <div>
    37. <h2>学校名称:{{name}}</h2>
    38. <h2>学校地址:{{address}}</h2>
    39. <student></student>
    40. </div>
    41. `,
    42. data(){
    43. return {
    44. name:'zt',
    45. address:'长沙'
    46. }
    47. },
    48. //注册组件(局部)
    49. components:{
    50. student
    51. }
    52. })
    53. //定义hello组件
    54. const hello = Vue.extend({
    55. template:`<h1>{{msg}}</h1>`,
    56. data(){
    57. return {
    58. msg:'学习!'
    59. }
    60. }
    61. })
    62. //定义app组件
    63. const app = Vue.extend({
    64. template:`
    65. <div>
    66. <hello></hello>
    67. <school></school>
    68. </div>
    69. `,
    70. components:{
    71. school,
    72. hello
    73. }
    74. })
    75. //创建vm
    76. new Vue({
    77. template:'<app></app>',
    78. el:'#root',
    79. //注册组件(局部)
    80. components:{app}
    81. })
    82. </script>
    83. </html>

    4.关于VueComponent

    1.school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。

    2.我们只需要写<school/>或<school></school>,Vue解析时会帮我们创建school组件的实例对象,即Vue帮我们执行的:new VueComponent(options)。

    3.特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent!!!!

    4.关于this指向:

    (1).组件配置中:

    data函数、methods中的函数、watch中的函数、computed中的函数 它们的this【VueComponent实例对象】。

    (2).new Vue(options)配置中:

    data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【Vue实例对象】。

    5.VueComponent的实例对象,以后简称vc(也可称之为:组件实例对象)。

    Vue的实例对象,以后简称vm。

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title>VueComponent</title>
    6. <script type="text/javascript" src="../js/vue.js"></script>
    7. </head>
    8. <body>
    9. <!-- 准备好一个容器-->
    10. <div id="root">
    11. <school></school>
    12. <hello></hello>
    13. </div>
    14. </body>
    15. <script type="text/javascript">
    16. Vue.config.productionTip = false
    17. //定义school组件
    18. const school = Vue.extend({
    19. name:'school',
    20. template:`
    21. <div>
    22. <h2>学校名称:{{name}}</h2>
    23. <h2>学校地址:{{address}}</h2>
    24. <button @click="showName">点我提示学校名</button>
    25. </div>
    26. `,
    27. data(){
    28. return {
    29. name:'zt',
    30. address:'长沙'
    31. }
    32. },
    33. methods: {
    34. showName(){
    35. console.log('showName',this)
    36. }
    37. },
    38. })
    39. const test = Vue.extend({
    40. template:`<span>atguigu</span>`
    41. })
    42. //定义hello组件
    43. const hello = Vue.extend({
    44. template:`
    45. <div>
    46. <h2>{{msg}}</h2>
    47. <test></test>
    48. </div>
    49. `,
    50. data(){
    51. return {
    52. msg:'你好啊!'
    53. }
    54. },
    55. components:{test}
    56. })
    57. // console.log('@',school)
    58. // console.log('#',hello)
    59. //创建vm
    60. const vm = new Vue({
    61. el:'#root',
    62. components:{school,hello}
    63. })
    64. </script>
    65. </html>

     一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype

    为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法

     

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title>一个重要的内置关系</title>
    6. <!-- 引入Vue -->
    7. <script type="text/javascript" src="../../js/vue.js"></script>
    8. </head>
    9. <body>
    10. <!-- 准备好一个容器-->
    11. <div id="root">
    12. <school></school>
    13. </div>
    14. </body>
    15. <script type="text/javascript">
    16. Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
    17. Vue.prototype.x = 99
    18. //定义school组件
    19. const school = Vue.extend({
    20. name:'school',
    21. template:`
    22. <div>
    23. <h2>学校名称:{{name}}</h2>
    24. <h2>学校地址:{{address}}</h2>
    25. <button @click="showX">点我输出x</button>
    26. </div>
    27. `,
    28. data(){
    29. return {
    30. name:'zt',
    31. address:'长沙'
    32. }
    33. },
    34. methods: {
    35. showX(){
    36. console.log(this.x)
    37. }
    38. },
    39. })
    40. //创建一个vm
    41. const vm = new Vue({
    42. el:'#root',
    43. data:{
    44. msg:'你好'
    45. },
    46. components:{school}
    47. })
    48. //定义一个构造函数
    49. /* function Demo(){
    50. this.a = 1
    51. this.b = 2
    52. }
    53. //创建一个Demo的实例对象
    54. const d = new Demo()
    55. console.log(Demo.prototype) //显示原型属性
    56. console.log(d.__proto__) //隐式原型属性
    57. console.log(Demo.prototype === d.__proto__)
    58. //程序员通过显示原型属性操作原型对象,追加一个x属性,值为99
    59. Demo.prototype.x = 99
    60. console.log('@',d) */
    61. </script>
    62. </html>

    单文件组件 

    创建 单文件组件 index.html   main.js App.vue  School.vue Student.vue

    1. <!--Student.vue-->
    2. <template>
    3. <div>
    4. <h2>学生姓名:{{name}}</h2>
    5. <h2>学生年龄:{{age}}</h2>
    6. </div>
    7. </template>
    8. <script>
    9. export default {
    10. name:'Student',
    11. data(){
    12. return {
    13. name:'张三',
    14. age:18
    15. }
    16. }
    17. }
    18. </script>

     

    1. <!--School -->
    2. <template>
    3. <div class="demo">
    4. <h2>学校名称:{{name}}</h2>
    5. <h2>学校地址:{{address}}</h2>
    6. <button @click="showName">点我提示学校名</button>
    7. </div>
    8. </template>
    9. <script>
    10. export default {
    11. name:'School',
    12. data(){
    13. return {
    14. name:'zt',
    15. address:'长沙'
    16. }
    17. },
    18. methods: {
    19. showName(){
    20. alert(this.name)
    21. }
    22. },
    23. }
    24. </script>
    25. <style>
    26. .demo{
    27. background-color: orange;
    28. }
    29. </style>

     

    1. <!--App.vue 汇总 -->
    2. <template>
    3. <div>
    4. <School></School>
    5. <Student></Student>
    6. </div>
    7. </template>
    8. <script>
    9. //引入组件
    10. import School from './School.vue'
    11. import Student from './Student.vue'
    12. export default {
    13. name:'App',
    14. components:{
    15. School,
    16. Student
    17. }
    18. }
    19. </script>

     

    1. <!-- main挂载-->
    2. import App from './App.vue'
    3. new Vue({
    4. el:'#root',
    5. template:`<App></App>`,
    6. components:{App},
    7. })

     

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title>练习一下单文件组件的语法</title>
    6. </head>
    7. <body>
    8. <!-- 准备一个容器 -->
    9. <div id="root"></div>
    10. <script type="text/javascript" src="../../js/vue.js"></script>
    11. <script type="text/javascript" src="./main.js"></script>
    12. </body>
    13. </html>

    浏览器不支持import需要额外配置webpack 

  • 相关阅读:
    14:00面试,14:06就出来了,问的问题有点变态。。。
    基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持本地图片上传与回显的功能实现(二)
    交叉编译器arm-linux-gcc,aarch64-himix200-linux-gcc命令找不到 not found ,所有原因全方位解析
    canal同步mysql数据变化到kafka(centos部署)
    【AICFD案例教程】轴流风扇仿真分析
    力扣HOT100 - 994. 腐烂的橘子
    Linux终端与SSH
    洛必达法则
    YOLOX源码之 wait_for_the_master
    进程间的通信方式简介
  • 原文地址:https://blog.csdn.net/weixin_40746230/article/details/125422658