• vue2(5)


    目录

    生命周期

    对组件的理解

     非单文件组件

    几个注意点

    组件嵌套

    VueCompomponent

    一个重要的内置关系

     单文件组件


    生命周期

    this.$el是真实DOM

     常用的生命周期钩子:

    1. mounted:发送ajax请求,启动定时器、绑定自定义事件、订阅消息等初始化操作
    2. beforeDestroy:清除定时器、解绑自定义事件、取消订阅消息等收尾工作

    关于销毁Vue实例:

    1. 销毁后借助Vue开发者工具看不到任何消息
    2. 销毁后自定义事件会失效,但原生DOM事件依然有效
    3. 一般不会在beforeDestroy操作数据,因为i即便操作数据,也不会再触发更新流程

    对组件的理解

    模块:

    1. 定义:向外提供特定功能的js程序,一般就是一个js文件
    2. 为什么要用?js文件很多很复杂
    3. 作用:复用js,简化js的编写,提高js运行效率

    组件:

    1. 理解:用来实现局部(特定)功能效果的代码集合(html/css/js/image...)
    2. 为什么:一个界面的功能很复杂
    3. 作用:复用编码,简化项目编码,提高运行效率

    模块化:

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

    组件化:

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

     

     非单文件组件

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

    1. 定义组件(创建组件)
    2. 注册组件
    3. 使用组件(写组件标签)

    1.如何定义一个组件?

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

    1. el不要写,为什么?——最终所有的组件都要结果一个vm的管理,由vm中的el决定服务哪个容器
    2. data必须写成函数,为什么?——避免组件被复用时,数据存在引用关系

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

    2.如何注册组件?

    1. 局部注册:靠new Vue的时候传入components选项
    2. 全局注册:靠Vue.component('组件名’,组件)

    3.编写组件标签:

    非单文件组件和单文件组件的区别:

    非单文件组件:一个文件中包含有n个组件

    单文件组件:一个文件只包含有1个组件

     

     为什么data要用对象式?

    1. // 当data用对象式式
    2. let data={
    3. a:1,
    4. b:2
    5. }
    6. const x1=data
    7. const x2=data

    1. function data(){
    2. return{
    3. a:1,
    4. b:2
    5. }
    6. }
    7. const x1=data()
    8. const x2=data()

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    9. head>
    10. <body>
    11. <div id="root">
    12. <hello>hello>
    13. <hr>
    14. <school>school>
    15. <hr>
    16. <student>student>
    17. div>
    18. <div id="root2">
    19. <hello>hello>
    20. div>
    21. body>
    22. <script>
    23. Vue.config.productionTip=false//阻止vue在启动时生成生产提示
    24. // 第一步,创建school组件
    25. const school=Vue.extend({
    26. template:`
    27. <div>
    28. <h2>学校名称:{{schoolName}}h2>
    29. <h2>学校地址:{{address}}h2>
    30. <button @click="showName">点我提示学校名button>
    31. div>
    32. `,
    33. data(){
    34. return{
    35. schoolName:'尚硅谷',
    36. address:'北京',
    37. }
    38. },
    39. methods:{
    40. showName(){
    41. alert(this.schoolName)
    42. }
    43. }
    44. })
    45. const student=Vue.extend({
    46. template:`
    47. <div>
    48. <h2>学生姓名:{{studentName}}h2>
    49. <h2>学生年龄:{{age}}h2>
    50. div>
    51. `,
    52. data(){
    53. return{
    54. studentName:'a',
    55. age:18
    56. }
    57. }
    58. })
    59. const hello=Vue.extend({
    60. template:`
    61. <div>
    62. <h2>你好呀!{{name}}h2>
    63. div>
    64. `,
    65. data(){
    66. return{
    67. name:'田园犬'
    68. }
    69. }
    70. })
    71. // 第二步,全局注册组件
    72. Vue.component('hello',hello)
    73. // 创建vm
    74. new Vue({
    75. el:'#root',
    76. // 第二步,注册组件(局部注册)
    77. components:{
    78. school,
    79. student
    80. }
    81. })
    82. new Vue({
    83. el:'#root2'
    84. })
    85. script>
    86. html>

    几个注意点

    1.关于组件名:

    一个单词组成:

    1. 首字母小写:school
    2. 首字母大写:School

    多个单词组成:

    1. kebab-case命名:my-school
    2. CamelCase命名:Myschool(需要Vue脚手架支持)

    备注:

    1. 组件名尽可能回避HTML中已有的元素名称,例如:h2,H2都不行
    2. 可以使用name配置指定组件在开发者工具中呈现的名字

    2.关于组件标签

    1. 第一种写法:
    2. 第二种写法:

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

    3.一个简写方式:

    1. const school=Vue.extend(options)可简写为
    2. const school=options
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    9. head>
    10. <body>
    11. <div id="root">
    12. <h1>{{msg}}h1>
    13. <my-school>my-school>
    14. div>
    15. body>
    16. <script>
    17. Vue.config.productionTip=false//阻止vue在启动时生成生产提示
    18. // 简写
    19. const s={
    20. template:`
    21. 学校名称:{{name}}

    22. 学校地址:{{address}}

  • `,
  • data(){
  • return{
  • name:'atguigu',
  • address:'北京'
  • }
  • }
  • }
  • new Vue({
  • el:'#root',
  • data:{
  • msg:'你好呀'
  • },
  • components:{
  • 'my-school':s
  • }
  • })
  • script>
  • html>
  • 组件嵌套

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    9. head>
    10. <body>
    11. <div id="root">
    12. <app>app>
    13. div>
    14. body>
    15. <script>
    16. Vue.config.productionTip=false//阻止vue在启动时生成生产提示
    17. // 定义student组件
    18. const student=Vue.extend({
    19. template:`
    20. <div>
    21. <h2>学生姓名:{{name}}h2>
    22. <h2>学生年龄:{{age}}h2>
    23. div>
    24. `,
    25. data(){
    26. return{
    27. name:'a',
    28. age:18
    29. }
    30. }
    31. })
    32. // 定义school组件
    33. const school={
    34. template:`
    35. <div>
    36. <h2>学校名称:{{name}}h2>
    37. <h2>学校地址:{{address}}h2>
    38. <student>student>
    39. div>
    40. `,
    41. data(){
    42. return{
    43. name:'atguigu',
    44. address:'北京'
    45. }
    46. },
    47. components:{
    48. student
    49. }
    50. }
    51. // 定义hello组件
    52. const hello=Vue.extend({
    53. template:`<h1>{{msg}}h1>`,
    54. data(){
    55. return{
    56. msg:'欢迎来到尚硅谷学习!'
    57. }
    58. }
    59. })
    60. // 定义app组件
    61. const app=Vue.extend({
    62. template:`
    63. <div>
    64. <hello>hello>
    65. <school>school>
    66. div>
    67. `,
    68. components:{
    69. school,
    70. hello
    71. }
    72. })
    73. new Vue({
    74. template:`<app>app>`,
    75. el:'#root',
    76. // 注册组件
    77. components:{
    78. app,
    79. }
    80. })
    81. script>
    82. html>

    VueCompomponent

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

    2.我们只需要写,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. 一个重要的内置关系:VueComponent.prototype.__proto__===Vue.prototype
    2. 为什么要有这个关系:让组件实例对象(vc)可以访问到Vue原型上的属性、方法

     单文件组件

    index.html

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>测试一下单文件组件的语法title>
    8. head>
    9. <body>
    10. <div id="root">div>
    11. <script src="./vue.js">script>
    12. <script src="./153.main.js">script>
    13. body>
    14. html>

     main.js

    1. import App from './152.App.vue'
    2. new Vue({
    3. el:'#root',
    4. template:``,
    5. components:{App},
    6. })

    App.vue

    1. <script>
    2. // 引入组件
    3. import School from './150.School.vue'
    4. import Student from './151.Student.vue'
    5. export default {
    6. name:'App',
    7. components:{
    8. School,
    9. Student
    10. }
    11. }
    12. script>

    School.vue

    1. <script>
    2. // 引入组件
    3. import School from './150.School.vue'
    4. import Student from './151.Student.vue'
    5. export default {
    6. name:'App',
    7. components:{
    8. School,
    9. Student
    10. }
    11. }
    12. script>

    Student.vue

    1. <script>
    2. // 组件交互相关的代码(数据、方法等)
    3. // 分别暴露、统一暴露 在school前加export
    4. export default{
    5. name:'Student',
    6. data(){
    7. return{
    8. name:'张三',
    9. age:18
    10. }
    11. }
    12. }
    13. script>
  • 相关阅读:
    重学设计模式-模板方法模式
    如何在Vue中引入video.js,并如何监听相关事件,禁止拖拽
    qrcode.min.js下载
    宏观经济学复习
    UNIAPP实战项目笔记28 商品分享功能点分享按钮分享到微信好友
    Go :测试写入屏障的位置和未发射位置(附完整源码)
    我觉得还挺好懂的meta learning 元学习总结
    16.0、C语言——指针详解(2)
    Java8从入门到精通 笔记
    Linux练习题
  • 原文地址:https://blog.csdn.net/m0_62520946/article/details/126422577