组件基础:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>组件</title>
<script src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<hello></hello>
<br>
<hi></hi>
<br>
<str></str>
</div>
<div id="box">
<hello></hello>
</div>
<script>
// 定义组件
Vue.component("hello", {
// 模板:组件内容
data() {
return {
msg: "我是子组件"
}
},
// 使用模板字符串(``)可以格式化语句
// 模板字符串必须要标签括起来,内容写在同一个根元素里面
template: `
<div>
hello!我是一个新来的<span>{{msg}}</span>
</div>`
});
// 全局组件
Vue.component("hi", {
// Vue里面有的,这里面也可以有
// 模板:组件内容
// 使用模板字符串(``)可以格式化语句
data() {
return {
msg: 12306
}
},
methods: {
fn() {
console.log(12306);
}
},
template: `
<div>
<p @click="fn">{{msg}}</p>
</div>`
})
let vm = new Vue({
el: "#app",
// 局部组件
components: {
"str": {
template: "<div>我是局部组件</div>"
}
}
})
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<hi></hi>
</div>
<script>
Vue.component("hi", {
data() {
return {
sum: 10
}
},
methods: {
fn() {
this.sum--;
}
},
template: `<div><button @click="fn">还有{{sum}}秒</button></div>`,
})
let vm = new Vue({
el: "#app",
})
</script>
</body>
</html>
注意事项:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>组件注意事项</title>
<script src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<h></h>
<!-- 在普通标签就要用斜杠 -->
<hello-world></hello-world>
</div>
<script>
// 用驼峰法命名时
Vue.component("helloWorld", {
template: "<h1>中国欢迎你</h1>"
});
Vue.component("h", {
// <HelloWorld></HelloWorld>在子组件可以照原样写也可以用斜杠法写
template: "<div>你好啊,英雄<helloWorld></helloWorld><span>{{msg}}</span></div>",
data() {
return {
sum: 0
}
},
methods: {
fn() {
}
}
})
let vm = new Vue({
el: "#app"
})
</script>
</body>
</html>
组件之间传值:
父组件传子组件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>组件传值——父向子</title>
<script src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<!-- :msg的msg是属性,"msg"的msg是变量,这里的msg是父组件data中的msg -->
<hello :msg="msg"></hello>
</div>
<script>
// 子组件的内容,放在外面写
var hello = {
// template不能忘记
// props是属性,这"msg"的msg是:msg的msg
props: ["msg"],
template: `<div>
<h1>你好,中国,{{msg}}</h1>
</div>`
}
let vm = new Vue({
el: "#app",
data: {
msg: "我是父组件的数据"
},
components: {
// "hello": helloText,
// 若组件名跟字符串模板名一样,可这样写
hello
}
})
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>父传子</title>
<script src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<!-- <hello :title="ptitle" :msg="pmsg"></hello> -->
<txt :title="ptitle" :msg="pmsg"></txt>
</div>
<script>
// Vue.component("hello", {
// props: ["title", "msg"],
// data() {
// return {
// cmsg: "我是子组件的数据"
// }
// },
// template: `
// <div>
// {{cmsg+"-"+title+"-"+msg}}
// </div>`
// })
var txt = {
props: ["title", "msg"],
data() {
return {
cmsg: "我是子组件的数据"
}
},
template: `
<div>
{{cmsg+"-"+title+"-"+msg}}
</div>`
};
let vm = new Vue({
el: "#app",
data: {
pmsg: "我是父组件的数据",
ptitle: "父组件"
},
components: {
txt
}
})
</script>
</body>
</html>
子组件传给父组件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>子传父</title>
<script src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 这里的形参只能放$event -->
<hello @send="send($event)"></hello>
</div>
<script>
Vue.component("hello", {
data() {
return {
msg: "我是子组件的数据",
num: 2021
}
},
// $emit('send',[msg,num])传的参可以是单个(msg),也可以是一个数组([msg,num])
template: `
<div>
{{msg}}<button @click="$emit('send',[msg,num])">传送数据</button>
</div>
`
})
let vm = new Vue({
el: "#app",
data: {
msg: "我的是父组件的数据"
},
methods: {
send(data) {
this.msg = data[0];
this.num = data[1];
console.log(this.msg);
console.log(this.num);
}
}
})
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>子传父</title>
<script src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<!-- @send是$emit()的第一个参数,sended()是父组件的方法(函数),$event是固定不能改的,是传送的数据-->
<hi @send="sended($event)"></hi>
<p>{{msg}}</p>
<p>{{num}}</p>
</div>
<script>
Vue.component("hi", {
data() {
return {
cmsg: "我是子组件的数据",
cnum: 20
}
},
// $emit('send',[cmsg,num])里面的第一个参数(send)是自定义事件的名称,第二个参数是传送的数据,可以是单个数据,也可以是多个数据,以数组[]的形式传送
template: `
<div>
{{cmsg}}{{cnum}}
<br>
<button @click="$emit('send',[cmsg,cnum])">点我传送数据</button>
</div>`
})
let vm = new Vue({
el: "#app",
data: {
msg: "",
num: ""
},
methods: {
// data传过来的是一个数组形式,所以使用下标来获取值
sended(data) {
// console.log(data);
this.msg = data[0];
this.num = data[1]
console.log(this.msg);
console.log(this.num);
}
},
})
</script>
</body>
</html>
同级组件之间:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>同级组件互传</title>
<script src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<hi></hi>
<hello></hello>
</div>
<script>
// 提供事件中心
let hub = new Vue();
// 传递方
Vue.component("hi", {
data() {
return {
sendData: "我是传送的数据"
}
},
template: `
<div>
<button @click="send">传送数据</button>
</div>`,
methods: {
send() {
// 传送的事件:toHello
hub.$emit("toHello", this.sendData)
}
}
});
// 接收方
Vue.component("hello", {
data() {
return {
msg: ""
}
},
template: `<div>{{msg}}</div>`,
// 自动执行(生命周期的已挂载阶段)钩子函数
mounted() {
console.log(123456);
// 接收的事件:toHello
hub.$on("toHello", (v) => {
// console.log("是hi传过来的数据" + v);
this.msg = v;
})
}
});
let vm = new Vue({
el: "#app"
});
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>兄弟互传</title>
<script src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<send></send>
<br>
<get></get>
</div>
<script>
// 兄弟组件之间的传送必须要有一个事件中心(hub)
var hub = new Vue();
// 传递方
Vue.component("send", {
data() {
return {
smsg: "我是传送数据的",
sendMsg: "干饭啦干饭啦"
}
},
template: `
<div>
{{smsg}}<br>
<button @click="sendData">发送</button>
</div>`,
// 传送方的hub.$emit()是写在methods里面的
methods: {
sendData() {
// 传递数据方方法里要有这个才行hub.$emit()
// hub.$emit()的第一个参数是传送的事件名称,第二个参数是传送的数据
hub.$emit("send-data", this.sendMsg);
}
}
})
// 接收方
Vue.component("get", {
data() {
return {
gmsg: "我是接收数据的",
getMsg: ""
}
},
// mounted(钩子函数)是Vue生命周期中的已挂载阶段,是自动执行的
// 接收方的hub.$emit()是写在mounted() {}里面的
mounted() {
// hub.$on()的第一个参数是传送的事件名称,与传送方的事件名一致,第二个参数是个方法
// data是传送过来的数据
hub.$on("send-data", (data) => {
// console.log(data);
this.getMsg = data;
})
},
template: `<div>{{gmsg}}<br>接收到的数据为:{{getMsg}}</div>`,
})
let vm = new Vue({
el: "#app",
})
</script>
</body>
</html>