默认情况:写在组件中的样式会全局生效-因此很容易造成多个组件之间的样式冲突问题。
scoped原理:
3. 给当前组件模板的所有元素,都会被添加上一个自定义属性data-v-hash值
4. css选择器后面,被自动处理,添加上了属性选择器
一个组件的data选项必须是一个函数。-保证每个组件实例,维护独立的一份数据对象。
export default {
data(){
return{
count:999
}
}
}
组件通信,就是指组件与组件之间的数据传递。
组件关系分类只有是否父子关系。
<!-- 1.给组件标签,添加属性的方式,传值 -->
<SbHeader :title="mytitle"></SbHeader>
export default {
//2.子通过props接收(数组接受多个传值)
props:['title']
}
<div>
<!-- 3.渲染使用 -->
我是son组件{{ title }}
</div>
methods:{
handleClick(){
//子中 $emit1.$emit触发事件,给父元素发送消息通知
this.$emit('changeTitle','传值')
}
}
<!-- 父中$emit2.父组件监听事件 -->
<SbHeader :title="mytitle" @changeTitile="changeFn"></SbHeader>
methods:{
//父中$emit3.提供处理函数,形参中获取参数
changeFn(newTitle){
this.mytitle =newTitle
}
}
定义:组件上注册的一些自定义属性
作用:向子组件传递数据
props效验: 不能乱传,控制台会有错误提示-帮助开发者快速发现错误
export default {
// props:[w]
props:{
w:Number//校验的属性名:类型
}
};
(2)1. 类型校验 2. 非空校验,必传属性 3. 默认值 4. 自定义校验
export default {
// props:[w]
props:{
w:Number,//类型校验
required:true,//必传的属性
default:0,//默认值
validator(){
return false//自定义校验
}
}
};
共同点:都可以给组件提供数据
区别:
作用:非父子组件之间(倾向于同层级),进行简易消息传递。(复杂场景-vuex)
//在js中,创建一个都能访问到的事件总线(空vue实例)-utils/EventBus.js
import Vue from 'vue'
const Bus =new Vue()
export default Bus
created(){
//非父子2.在接收方,进行监听Bus的事件($on是监听)
Bus.$on('sendMsg',(msg)=>{
this.msg=msg
})
},
clickSend(){
//非父子3.发送方触发事件的方式传递参数(发布消息)(触发事件用$emit)
Bus.$emit('sendMsg','有病')
}
provide&inject作用:跨层级共享数据
<template>
<div>
<select :value="cityId" @change="handleChange">
<option value="101">101</option>
<option value="102">102</option>
<option value="103">103</option>
</select>
</div>
</template>
<script>
export default {
props: {
cityId: String,
},
methods: {
handleChange(e) {
// console.log(e.target.value);
this.$emit('changeId',e.target.value)
},
},
};
</script>
<style>
</style>
<template>
<div class="app">
<BaseSelect :cityId="selectId"
@changeId="selectId=$event"></BaseSelect>
</div>
</template>
<script>
import BaseSelect from "./components/BaseSelect.vue";
export default {
data() {
return {
selectId: '102',
};
},
components: {
BaseSelect,
},
};
</script>
<style>
</style>
作用:可以实现子组件与父组件的双向绑定,简化代码
特点:prop属性名,可以自定义,非固定为value
场景:封装弹框类的基础组件,visible属性true显示false隐藏
本质 就是:属性名和@uodate:属性名 合写
<div class="app">
<!-- :visible.sync =>:visible+ @update:visible-->
<BaseSelect :visible.sync="showoff"></BaseSelect>
</div>
close(){
this.$emit('update:visible',false)
}
作用:利用ref和$refs可以用于获取dom元素,或组件实例
特点:查找范围-当前组件内(比queryselect更精确稳定)
(1)获取dom
<option ref="sb" value="101">101</option>
const myChat =echarts.init(this.$refs.sb)
(2)获取组件:
<BaseSelect ref="baseherf"></BaseSelect>
<button @click="handleset">set</button>
methods:{
handleset(){
console.log(this.$refs.baseherf.close())
}
},
显示之后立刻获取焦点是不能成功的
vue是异步更新dom(提升性能·)
this.isShowEdit=true//显示输入框
this.$refs.inp.focus()//获取焦点
n e x t T i c k : 等 d o m 更新后,才会触发执行此方法里的函数体语法 : t h i s . nextTick:等dom更新后,才会触发执行此方法里的函数体 语法:this. nextTick:等dom更新后,才会触发执行此方法里的函数体语法:this.nextTick(函数体)
this.$nextTick(()=>{
this.$refs.inp.focus()
})