• Vue(组件化编程:非单文件组件、单文件组件)


    一、组件化编程

    1. 对比传统编写与组件化编程(下面两个解释图对比可以直观了解)

    传统组件编写:不同的HTML引入不同的样式和行为文件

    组件方式编写:组件单独,复用率高(前提组件拆分十分细致) 

    理解为封装行为:html,css,js封装在一个文件中

    解释模块化和组件化的区别:

    组件化:css,js,html三件套使用在同一部分的代码封装在一个组件中

    模块化:只是将js文件进行拆分为多个文件

     

    2. 组件化编程区分 

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

    单文件组件:一个文件中只包含一个组件:后缀名是.vue(项目中多使用此方法)

    3. 非单文件组件的引出 

    使用两类数据进行划分组件包装部分,引出单文件组件的使用

    • 可以给每一部分进行划分并命名

    1. "root">
    2. <h2>学校名称:{{schoolName}}h2>
    3. <h2>学校地址:{{addrss}}h2>
    4. <hr />
    5. <h2>学生名称:{{studentName}}h2>
    6. <h2>学生年龄:{{age}}h2>
  • //vue数据
  • const vm = new Vue({
  • el: "#root",
  • data: {
  • schoolName: "清华",
  • addrss: "北京",
  • studentName: "李华",
  • age: "18",
  • },
  • });
  •  

     4. 单文件组件的使用

    (1)局部注册(在vue配置项components中注册)

    • Vue.extend({}):创建组件(可以给此组件进行命名)

      • 出现很多配置项:但是几乎和Vue实例的配置项相同

      • const school = Vue.extend({})

      • 注意:此处不可以使用el绑定模板(template:``配置进行展示容器内容)

        1. // el: "#root",//组件定义:一定不写el配置项:因为最终都要被vm管理,
        2. //由vm决定服务于哪个容器
        3. // 利用函数式写data:如果使用对象式,当其他模板调用时候修改也会修改原来的数据
        4. template: `
        5. 学校名称:{{schoolName}}

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

  • `,
  • 注意:此处的data使用的是函数式返回(不是对象式):因为多次一使用同一个组件,当后使用组件部分改变data中数据,前面组件使用组件的数据也会改变

    1. data() {
    2. return {
    3. schoolName: "清华",
    4. address: "北京",
    5. };
    6. },
  • components:{'组件名','...'} :注册组件(在Vue实例中使用此配置项):局部注册

    1. components: {
    2. // 完整写法:重新组件命名,创建组件的名字不是组件名,注册组建的名字才是组件名
    3. // xuexiao: school,
    4. // xueshneg: student,
    5. // 简写:相同的名字
    6. school,
    7. student,
    8. },
    1. <school>school>
    2. <school>school>

    给单文件组件添加事件:直接在组件的配置模板中绑定事件,并在组件中添加配置回调方法

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

    创建组件并进行全局注册:此时的组件标签就可以在任何Vue绑定的模板中使用

    1. //1. hello全局组件创建
    2. const hello = Vue.extend({
    3. template: `
    4. 你好{{name}}

  • `,
  • data() {
  • return {
  • name: "TOM",
  • };
  • },
  • });
  • // 2. 全局注册组件(组件名字,组件在哪):可以使用在任何vue绑定的模板中
  • Vue.component("hello", hello);
  •  5. 单文件组建的注意点

    1. // 简写创建组件
    2. const school = {
    3. name: "xlf",
    4. template: ` <div>
    5. <h2>学校名称:{{name}}h2>
    6. <h2>学校地址:{{address}}h2>
    7. div>`,
    8. data() {
    9. return {
    10. name: "xlf",
    11. address: "北京",
    12. };
    13. },
    14. };

     6. 组件的嵌套

    以下展示说明大组件种包含着小组件也就是所谓的嵌套

     

    1. //子组件创建
    2. const student = Vue.extend({
    3. name: "student",
    4. template: `
    5. 学生姓名{{name}}

    6. 学生年龄{{age}}

  • `,
  • data() {
  • return {
  • name: "德华",
  • age: "18",
  • };
  • },
  • });
  • //父组件创建并注册子组件(在负组件中使用子组件标签)
  • const school = Vue.extend({
  • name: "school",
  • template: `
  • 学校名称:{{name}}

  • 学校地址;{{address}}

  • `,
  • data() {
  • return {
  • name: "清华",
  • address: "北京",
  • };
  • },
  • // 在组件内直接注册
  • components: {
  • student,
  • },
  • });
  • //最后总结在vue中
  • new Vue({
  • template: ``,
  • el: "#root",
  • data: {},
  • // 2.注册组件
  • components: {
  • school,
  • },
  • });
  •  开发中一创建app组件:管理所有组件(用法都是套娃)

    1. // 1.定义组件:注册给谁就在谁的模板上写组件标签
    2. const school = Vue.extend({
    3. name: "school",
    4. template: `
    5. 学校名称:{{name}}

    6. 学校地址;{{address}}

    7. `,
    8. data() {
    9. return {
    10. name: "清华",
    11. address: "北京",
    12. };
    13. },
    14. // 在组件内直接注册
    15. components: {
    16. student,
    17. },
    18. });
    19. // 定义app组件:注册亲子级组件,并及那个子级组件模板写入
    20. const app = Vue.extend({
    21. template: `
    22. `,
    23. components: {
    24. hello,
    25. school,
    26. },
    27. });
    28. new Vue({
    29. template: ``,
    30. el: "#root",
    31. data: {},
    32. // 2.注册组件
    33. components: {
    34. app,
    35. },
    36. });

    7. Vue.Component(组件实例化)

    使用一个组件:进行了解Vue.Component

    1. "root">
    2. <school>school>
    3. //vue
    4. // 1.定义组件school
    5. const school = Vue.extend({
    6. template: `
    7. 学校名称:{{name}}

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

    9. `,
    10. data() {
    11. return {
    12. name: "清华",
    13. address: "北京",
    14. };
    15. },
    16. });
    17. new Vue({
    18. el: "#root",
    19. // 2.注册组件
    20. components: {
    21. school,
    22. },
    23. });
    console.log(school);

     

    1. // 定义组件hello
    2. const hello = Vue.extend({
    3. template: `
    4. 学校名称:{{msg}}

    5. `,
    6. data() {
    7. return {
    8. msg: "hello",
    9. };
    10. },
    11. methods: {
    12. showName() {
    13. console.log("showName", this);
    14. },
    15. },
    16. });
    17. // 检验VuComponent的不同
    18. school.a = 99;
    19. console.log(school === hello); //false
    20. console.log(school.a); //99
    21. console.log(hello.a); //没有

     8. 重要的内置关系

    组件是可复用的Vue实例

    区分显示原型对象和隐式原型对象 

    1. // 定义构造函数
    2. function demo() {
    3. this.a = 1;
    4. this.b = 2;
    5. }
    6. const d = new demo();
    7. // 以下构造函数原型对象和实例对象原型对象最后都指向一个原型对象
    8. console.log(demo.prototype); //显示原型属性(一般放东西)
    9. console.log(d.__proto__); //隐式原型对象(一般开始找)
    10. console.log(demo.prototype === d.__proto__);//true
    11. //程序员通过显示原型属性操作原型对象,追加一个x属性,值为99
    12. demo.prototype.x = 99;

     

    Vue.Component.prototype.__proto__===Vue.prototype 

    Vue.Component原型对象的原型对象执行Vue原型对象

    让组件实例对象那个vc可以访问到Vue原型上的属性、方法

     9. 单文件组件方式:.vue后缀

    vue文件需要(处理加工变成js文件)两种处理方式

    vue文件命名

     

     安装插件可以生成vue模板:

     

    1. <script>
    2. export default {
    3. //注意组件模块化引入,所以需要把js暴露
    4. }
    5. script>
    6. <style>
    7. style>

    此处需要使用暴露方式把文件暴露出去:也就是允许其他文件引入

     

    (1) 创建两个组件:School组件、Student组件(这个类似)

    1. <script>
    2. export default {
    3. name: "School",
    4. data() {
    5. return {
    6. schoolName: "清华",
    7. address: "北京",
    8. };
    9. },
    10. methods: {
    11. showName() {
    12. alert(this.schoolName);
    13. console.log(this); //指向当前组件
    14. },
    15. },
    16. };
    17. script>
    18. <style>
    19. .demo {
    20. background-color: pink;
    21. }
    22. style>

    (2)引入组件文件并在app组件中嵌套注册:注意模板需要div包裹

    1. <script>
    2. // 先引入组件
    3. import School from './School.vue'
    4. import Student from './Student.vue'
    5. // 再进行对外暴露并注册组件
    6. export default {
    7. name: 'App',
    8. components: {
    9. School,
    10. Student
    11. }
    12. }
    13. script>
    14. <style>
    15. style>

    (3) 组件分配完毕之后需要由vm统一管理

    创建:main.js

    1. import App from './App.vue'
    2. // 浏览器不支持模块化语法
    3. new Vue({
    4. el: '#root',
    5. template:``,
    6. components: {App}
    7. })

    (4)需要容器:index.html与vue实例进行关联

    1. "root">
    2. <script src="../vue/vue.js">script>
    3. <script src="./main.js">script>

    浏览器不能能直接支持ed6模块化语法:也就是引入模块化(需要配置脚手架环境进行运行)

     

  • 相关阅读:
    “在 ArchiMate EA 建模中的组合关系:构建块和依赖关系
    电商平台API接口大全(商品详情 API 返回值说明)
    算法通关村-----数组中元素出现次数问题
    [极客大挑战 2019]FinalSQL
    服务器(Linux)配置node环境及运行ts文件(express框架)
    vivo 在离线混部探索与实践
    家庭服务器门户Easy-Gate
    vue2的组件通信方式
    批处理入门
    carrier-server报错处理
  • 原文地址:https://blog.csdn.net/weixin_57920269/article/details/130440068