component("组件名字" { template : 组件内容})
// 使用全局调用
Vue.component("Counter",{
template : `
`
})
components
属性,components : { 组件名字 : { template : 组件内容}}
new Vue({
el : "#app",
data : {
},
components : {
// 注册
Counter : {
template : `
`
}
}
})
var Counters = {
template : `
`
}
new Vue({
el : "#app",
data : {
},
// 注册组件
components : { Counters },
})
<Counter>Counter>
<counter>counter>
<Counters>Counters>
<counters>counters>
-
来链接<Counter-Item>Counter-Item>
<counter-item>counter-item>
data : function() { return {}}
简写 data() {return {}}
components : {
Counters : {
template : `
`,
// 组件定义的参数
data : function() {
return {num : 1};
},
}
}
:传递数据的中间量的名字="父组件的数据"
props : ["传递数据的中间量的名字"]
,这个宽泛props : { "传递数据的中间量的名字" : {type : 数据类型,defalut : 默认值}}
,这个比较严谨
data() {}
中created() {}
<div id="app">
<Counters v-for="(item,index) in list" :key="index" :count="item">Counter>
div>
var Counters = {
template : `
`,
data : function() {
return {num : 1};
},
// 接收, 这种不是很严格
// props : ["count"],
// 接收,设置默认值
props : {
"count" : {type : Number,default : 0}
},
// 子组件接收父组件的数据,如果更改时会报错,
// 因为:子组件很多,父组件的数据就一个,如果子组件都去改父组件的数据,
// 会引发混乱
// 所以父组件的参数,传递是单向的,只读
// 为了解决这个问题,可以把传递过来的数据接收到子组件自己的数据中
// 在生命周期函数最早能接收数据的阶段开始created
created : function() {
// 在创建结束,挂载最早的阶段,把父组件的参数赋值给子组件自己的数据
this.num = this.count;
}
}
}
new Vue({
el : "#app",
data : {
},
// 注册组件
components : { Counters },
})
this.$emit("传递数据的事件名",传递的数据);
@传递数据的事件名="触发事件名($event)"
,$event
是子组件传递过来的数据因为就是一个事件,所以就可以写在methods里面,写事件方法,把传递过来的数据,再赋值给父组件的数据内
<div id="app">
<Step :min="20" :max="100" :count="5" @numchange="numbers($event)">Step>
<Step>Step>
<p v-if="numberss">{{numberss}}p>
div>
var Step = {
template : `
`,
data : function() {
return {num : 1};
},
props : {
"count" : {type : Number,default : 1},
"min" : {type : Number,default : 1},
"max" : {type : Number,default : 999},
"step" : {type : Number,default : 9},
},
created : function() {
this.num = this.count
},
methods : {
check() {
if(this.num <= this.min) {
this.num = this.min;
}
if(this.num >= this.max) {
this.num = this.max
}
// 子组件将更改的num数据,发送一个numchange事件,用于父组件接收
this.$emit("numchange",this.num);
// 子组件为了传递数据,发送一个numchange方法,将this.num数据,发送给父组件
},
cal(type) {
this.num += this.count*type;
this.check()
}
}
}
new Vue({
el : "#app",
// 定义父组件的数据numberss
data : {numberss : null},
methods : {
// 父组件执行触发的子组件的数据的额方法,e就是$event传递过来的数据
numbers(e) {
// 把子组件传递过来的数据赋值给父组件上的数据
this.numberss = e;
}
},
components : {Step},
})
匿名插槽
<组件名> <任何标签>内容任何标签>组件名>
,这个任何标签
中的内容因为有插槽的存在可以插入到了组件
中
再组件中放入一个这个标签,可以将组件,标签等插入打组件内部<div id="app">
<h1>组件插槽h1>
// parent是一个组件,
<Parent>
// p是 加的内容,可以插入组件内部
<p>我是组件里面的pp>
// parent 还是刚刚的组件,发现组件内部嵌套组件
<Parent>
<Parent>
Parent>
Parent>
Parent>
div>
var Parent = {
template : `
parent组件里的
`,
}
new Vue({
el : "#app",
data : {},
components : {Parent}
})
<任何标签 slot="名字">任何标签>
,需要传递的内容
,将对应的内容插入到与名字对应相等的地方
<html>
<head>
<meta charset="utf-8">
<title>title>
<script src="./vue.js" type="text/javascript" charset="utf-8">script>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
body {
padding: 50px;
}
.model {
background-color: rgba(0,0,0,.3);
position: absolute;
z-index: 1000;
height: 100vh;
width: 100%;
left: 0;
right: 0;
top: 0;
display: flex;
align-items: center;
justify-content: center;
}
.model-content {
width: 400px;
height: 300px;
background-color: #fff;
display: flex;
flex-direction: column;
}
.model-title{
line-height: 44px;
background-color: #fafafa;
display: flex;
justify-content: space-between;
padding-left: 15px;
}
.close{ width: 44px; text-align: center; color:coral;}
.model-foot{ height: 44px; padding: 0 15px; text-align: right;}
.model-body{flex:1}
style>
head>
<body>
<div id="app">
<h1>具名插槽h1>
<button @click="flag = true">弹出button>
<Model :title="'你确定要离开吗'" :visible="flag" @close="flag=$event">
<div slot="foot">
<button @click="flag = false">取消button>
<button @click="flag = false">确定button>
div>
Model>
div>
body>
<script type="text/javascript">
var Model = {
template : `
{{title}}
×
内容
确定
`,
props : {
"title" : {type : String,default : ''},
"visible" : {type : Boolean,default : false}
}
}
new Vue({
el : "#app",
data : {
flag : false
},
components : {Model}
})
script>
html>
<html>
<head>
<meta charset="utf-8">
<title>title>
<script src="./vue.js" type="text/javascript" charset="utf-8">script>
head>
<body>
<div id="app">
<Inp @add="add($event)">Inp>
<List :list="list" @del="del($event)">List>
div>
body>
<script type="text/javascript">
var Item = {
template : `
{{item.title}}
`,
props : {
"item" : {type : Object,default : {}}
}
};
var List = {
template : `
`,
props : {
"list" : {type : Array,default : []},
},
components : {Item}
};
var Inp = {
template : `
`,
data : function() {
return {temp : ""}
},
methods : {
addHd() {
this.$emit("add",this.temp);
this.temp = '';
}
}
};
new Vue({
el : "#app",
data : {
list : [
{done : true,title : "吃饭"},
{done : true,title : "睡觉"},
{done : true,title : "打豆豆"}
]
},
components : {List,Inp},
methods : {
del(e) {
var index = this.list.indexOf(e);
this.list.splice(index,1);
},
add(val) {
this.list.unshift({
done : false,
title : val
})
}
}
})
script>
html>