1、为什么通信?
2、分类
<1>父子组件通信
<template id="father">
<div>
<p>父组件p>
<Son :num='num'>Son>
div>
template>
<template id="son">
<div>
<p>子组件p>
<p>父组件给了我{{num}}p>
div>
template>
Vue.component("Father", {
template: "#father",
data() {
return {
num: 100
}
}
})
Vue.component("Son", {
template: "#son",
// props: ['num']
// props: {
// num: Number
// }
props: {
num: {
validator(val) {
return val > 200 //数据验证
}
}
}
})
<2>子父组件通信
<div id="app">
<Father>Father>
div>
<template id="father">
<div>
<p>父组件p>
<p>子组件给了我{{fNum}}p>
<Son @give='fn'>Son>
div>
template>
<template id="son">
<div>
<p>子组件p>
<p>p>
<button @click='giveNum'>给父组件numbutton>
div>
template>
Vue.component("Father", {
template: "#father",
data() {
return {
fNum: 0
}
},
methods: {
fn(val) {
this.fNum = val;
}
}
})
Vue.component("Son", {
template: "#son",
data() {
return {
num: 1234
}
},
methods: {
giveNum() {
this.$emit("give", this.num);
}
}
})
<3>非父子组件通信
<template id="father">
<div>
<p>父组件p>
<Son @fn="fn">Son>
<Daughter ref="daughter">Daughter>
div>
template>
<template id="son">
<div>
<p>子组件1p>
<button @click="send">给子组件2发消息button>
div>
template>
<template id="daughter">
<div>
<p>子组件2p>
<p v-show='flag'>子组件1给了我发消息了p>
div>
template>
Vue.component("Father", {
template: "#father",
methods: {
fn() {
this.$refs.daughter.changeFlag() //!!!!!!!!!
}
}
})
Vue.component("Son", {
template: "#son",
methods: {
send() {
this.$emit('fn')//!!!!!!!!
}
}
})
Vue.component("Daughter", {
template: "#daughter",
data() {
return {
flag: false
}
},
methods: {
changeFlag() {
this.flag = !this.flag
}
}
})
<template id="father">
<div>
<p>这是父组件p>
<Son>Son>
<Daughter>Daughter>
div>
template>
<template id="son">
<div>
<p>这是子组件1p>
<button @click="send">给子组件2发送消息button>
div>
template>
<template id="daughter">
<div>
<p>这是子组件2p>
<p v-if='flag'>我收到了子组件1传来的消息p>
div>
template>
var bus = new Vue();//!!!!!!!!!!!!!
Vue.component("Father", {
template: "#father",
})
Vue.component("Son", {
template: "#son",
methods: {
send() {
bus.$emit("get")//!!!!!!!!!!!!1
}
}
})
Vue.component("Daughter", {
template: "#daughter",
data() {
return {
flag: false
}
},
mounted() { //表示组件挂载结束。可在视图中看到该组件
var that = this;
bus.$on("get", function () {//!!!!!!!
return that.flag = !that.flag;
})
}
})
<4>非常规通信
<template id="father">
<div>
<p>这是父组件p>
<p>{{fnum}}p>
<Son :fn="fn">Son>
div>
template>
<template id="son">
<div>
<p>这是子组件p>
<button @click="fn(num)">给父组件发消息button>
div>
template>
Vue.component("Father", {
template: "#father",
data() {
return {
fnum: 0
}
},
methods: {
fn(val) {
this.fnum = val
}
}
})
Vue.component("Son", {
template: "#son",
data() {
return {
num: 12345
}
},
props: ['fn']
})
<template id="father">
<div>
<p>这是父组件p>
<p>{{fnum.num}}p>
<Son :fnum="fnum">Son>
div>
template>
<template id="son">
<div>
<p>这是子组件p>
<input type="text" name="" id="" v-model="fnum.num">
div>
template>
Vue.component("Father", {
template: "#father",
data() {
return {
fnum: {
num: 1112222
}
}
}
})
Vue.component("Son", {
template: "#son",
props: ["fnum"]
})
1、分类:
//Vue2.5的使用形式
<div d="app">
<Hello>
<header slot="header">header>
<footer slot="footer">footer>
Hello>
div>
<template id="hello">
<div>
<slot name="header">slot>
<slot name="footer">slot>
div>
template>
2、v-slot指令:可以将组件的数据在组件的内容中使用
//Vue2.6x的使用形式
//v-slot指令
<div id="app">
<Hello>
<template v-slot:csq="Orange">
<div>
<p>我在里面p>
{{Orange.info}}
div>
template>
Hello>
div>
<template id="hello">
<div>
<p>我在外面p>
<slot :info="info" name="csq">slot>
div>
template>
Vue.component("Hello", {
template: "#hello",
data() {
return {
info: "发送进来了"
}
}
})
Vue框架使用css3和js实现过度效果
1、实现方式
1、作用
对已存在的数据做数据格式化
2、定义
//全局定义
//Vue.filter(过滤器名称:function(){
//}
//局部定义
filters: {
'imgFilter': function ( val ) { //val表示需要格式化的数据
return val.replace( 'w.h', '128.180')
}
},
3、使用
1、 定义形式
//Vue.directive("自定义指令名",选项)
Vue.directive("focus",{
bind(el,binding,vnode,oldVnode){
//当自定义指令和元素绑定时触发
},
inserted(el,binding,vnode,oldVnode){
//当自定义指令绑定的元素插入到页面时触发
},
updated () {
// 当自定义指令的元素或是他的子元素发生变化式触发
},
componentUpdate () {
//当自定义指令的元素或是他的虚拟子节点 发生变化式触发
},
unbind () {
// 当自定义指令绑定的元素解绑时触发
}
})
2、使用
// Vue.directive('focus',{
// inserted ( el,binding,vnode,oldVnode ) {
// if ( binding.modifiers.a ) {
// el.style.background = 'red'
// } else {
// el.style.background = 'blue'
// }
// el.value = binding.expression
// el.focus()
// },
// })
new Vue({
el: '#app',
directives: {
'focus': {
inserted ( el ) {
el.focus()
}
}
}
})
swiper是一个实现滑动操作的第三方库
官网:swiper官网