自学Vue的第04天
组件化开发
局部组件
<div id="app"></div>
<script></script>
复制代码
1、这里的注册局部组件的时候,没有使用键值对,默认k-v相等
2、这里的创建局部组件的时候,其实用了个语法糖,完整的写法其实是
var MyFooter = Vue.extend({
template: `
<div>我是MyFooter</div>
`
})
复制代码
全局组件
Vue.component('MyLow', {
template: `
<div>我是MyLow</div>
`
})
new Vue({
el: '#app',
//注册局部组件
components: {
MyHeader, MyBody, MyFooter
},
template: `
<div>
<my-header></my-header>
<my-body></my-body>
<my-footer></my-footer>
<my-low></my-low>
</div>
`,
data: function () {
return {}
}
})
复制代码
全局组件,使用的时候无需声明
完整代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>组件化开发</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="app"></div>
<script></script>
</body>
</html>
复制代码
slot插槽、ref、parent
slot举例
<script></script>
复制代码
如果父组件中没有slot
,那么在使用的时候<div>我是插槽内容</div>
是不会被渲染的
slot还可以指定名称
var Parent={
template: `
<div>我是父组件<slot name="hello"></slot></div>
`
}
new Vue({
el: '#app',
components:{
Parent
},
template: `
<div>
<parent>
<div>我是插槽内容</div>
<div slot="hello">我是插槽内容2</div>
</parent>
</div>
`,
data: function () {
return {}
}
})
</script>
复制代码
指定名称的内容才进行渲染
$ref
<script></script>
复制代码
$parent
就好像使用$refs
获取到子组件的信息,
我们可以使用$parent
获取到父组件的信息
var Child = {
template: `
<div>我是子组件</slot></div>
`,
created:function(){
console.log(this.$parent);
}
}
复制代码
组件的通讯
- 父子组件通讯
- 非父子组件通讯
父传子
<script>
var Child = {
//第三步:子组件使用父组件传递过来的数据
template: `
<div>我是子组件:{{sendChild}}</div>
`,
//第一步:子组件接收父组件参数的名称
props:['sendChild']
}
var Parent = {
//第二步:通过特定名称的属性,传递数据给子组件
template: `
<div>
我是父组件
<child sendChild="父组件给的"></child>
</div>
`,
components: {
Child
}
}
new Vue({
el: '#app',
components: {
Parent
},
template: `
<div>
<parent>
</parent>
</div>
`,
data: function () {
return {}
}
})
</script>
复制代码

子传父
非父子组件
<script type="text/javascript">
Vue.prototype.$bus=new Vue()
var MyHeader={
template:`
<div>
我是头部
{{ headermsg }}
</div>
`,
data(){
return {
headermsg:'我是头部的信息'
}
},
created(){
// var self=this
// self.$bus.$on('sending',function(val){
// self.headermsg=val
// })
this.$bus.$on('sending',val=>{
this.headermsg=val
})
}
}
var MyBody={
template:`
<div>我是身体</div>
`,
}
var MyFooter={
template:`
<div>我是底部<button @click='sendhead'>我要跟头部通信</button></div>
`,
methods:{
sendhead(){
this.$bus.$emit('sending','我是底部的数据')
}
}
}
new Vue({
el:'#app',
components:{
MyHeader,
MyBody,
MyFooter
},
template:`
<div>
<my-header></my-header><hr>
<my-body></my-body><hr>
<my-footer></my-footer>
</div>
`,
data(){
return {}
},
})
</script>
复制代码