学习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>
组件使用总结:
- (创建)封装html+css+vue到独立的.vue文件中
- (引入注册)组件文件 => 得到组件配置对象
- (使用)当前页面当做标签使用
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
\