学习vuer

90 阅读3分钟

学习vue第四天

vue组件_概念

组件是可复用的 Vue 实例, 封装标签, 样式和JS代码

组件化 :封装的思想,把页面上 可重用的部分 封装为 组件,从而方便项目的 开发 和 维护

一个页面, 可以拆分成一个个组件,一个组件就是一个整体, 每个组件可以有自己独立的 结构 样式 和 行为(html, css和js)

组件和 vue的关系

vue是大的(最外层)对象组件: 组件也是vue对象, 只不过里面的属性没有 vue这个对象多。组件的原型对象 是 Vue。 Vue的原型对象是Object组件的价值: 1.复用性 2.组件的独立性 3.模块化(vue组件)

vue组件_基础使用

目标: 每个组件都是一个独立的个体, 代码里体现为一个独立的.vue文件

口诀: 哪部分标签复用, 就把哪部分封装到组件内

(重要): 组件内template只能有一个根标签

(重要): 组件内data必须是一个函数, 独立作用域

全局 - 注册使用

全局入口在main.js, 在new Vue之上注册

语法:

import Vue from 'vue'
import 组件对象 from 'vue文件路径'Vue.component("组件名", 组件对象)

main.js - 立即演示


// 目标: 全局注册 (一处定义到处使用)
// 1. 创建组件 - 文件名.vue
// 2. 引入组件
import Pannel from './components/Pannel'
// 3. 全局 - 注册组件
/*
  语法: 
  Vue.component("组件名", 组件对象)
*/
Vue.component("PannelG", Pannel)

全局注册PannelG组件名后, 就可以当做标签在任意Vue文件中template里用

单双标签都可以或者小写加-形式, 运行后, 会把这个自定义标签当做组件解析, 使用组件里封装的标签替换到这个位置


<PannelG></PannelG>
<PannelG/>
<pannel-g></pannel-g>

局部 - 注册使用

语法:


import 组件对象 from 'vue文件路径'export default {
    components: {
        "组件名": 组件对象
    }
}

任意vue文件中中引入, 注册, 使用


<template>
  <div id="app">
    <h3>案例:折叠面板</h3>
    <!-- 4. 组件名当做标签使用 -->
    <!-- <组件名></组件名> -->
    <PannelG></PannelG>
    <PannelL></PannelL>
  </div>
</template><script>
// 目标: 局部注册 (用的多)
// 1. 创建组件 - 文件名.vue
// 2. 引入组件
import Pannel from './components/Pannel_1'
export default {
  // 3. 局部 - 注册组件
  /*
    语法: 
    components: {
      "组件名": 组件对象
    }
  */
  components: {
    PannelL: Pannel
  }
}
</script>

组件使用总结:

  1. (创建)封装html+css+vue到独立的.vue文件中
  2. (引入注册)组件文件 => 得到组件配置对象
  3. (使用)当前页面当做标签使用

1.定义组
2.导入组件  import 组件名 from "./components/main.vue";
3.注册: 相当于挂载到vue上
     components: {
      组件名,
    },
4.渲染页面
    <组件名></组件名>
    注意点:
        1.组件名不要和普通的标签重名
        2.<组件名></组件名> 或者 <组件名 />
        3.MainApp 组件名的规范 第一个字母大写 后面的第一大写
            <MainApp></MainApp>
            <Main-app></Main-app>

组件传值


父----->子
    父组件:
        <children abc='值'></children>
    子组件:
        props:['abc']
    子组件就可以使用abc这个变量了  props就是一个变量(父组件传递来了)
    注意事项:
        1.在子组件修改父组件的值是修改不了了。
        2.如果传递子组件的是一个对象格式,那么是可以修改父组件的。
        3.在有需求的时候  方便的 完全可以传递对象,子直接修改内容。
    单向数据流:
        父给子传值, 子组件不建议修改组件的值,
        父传递给子,子是修改不了的(基本数据类型)------》 基本数据类型
 子-----》父
    1.需要在父组件上定义 自定义事件 @update='处理函数'
    2.子里面需要触发@update 
    
    <button @click='fn'></button>
    methods:{
      fn(){
        this.$emit('update',参数)
      }
    }
    <childrenOne @update='handel' />
    methods:{
      handel(参数){
        参数 从子传递来的
        this.num+=val
      }
    }

扩展

方法2ref $refs


    1.通过 给组件设置 ref属性
    <组件 ref='abc'></组件>
    script:
        this.$refs.abc= 整个子组件  通过组件就可以拿到组件的信息了
总结:
    App.vue----> <子组件 ref='abc'></子组件>  msg:'子组件'
    app.vue----> this.$refs.abc.msg

方法3 $parent children 获取父组件 和 子组件


2. 通过$parent  $children 获取父组件 和 子组件
    在父组件上:
        this.$children[0]去访问子组件
    在子组件上:
        this.$parent父组件
总结:
    App.vue---->this.$children[0].msg
    子组件------>this.$parent.info

方法4 在祖先组件上传给任意后代组件


在祖先组件上:
    provide:{
      app:'信息'
    }
    在孙子组件:
       inject:['app']
       this.app

\