Vue推荐开发方式是:SPA(single page (web) application)单页面web应用,一个应用中只能存在一个vue实例
- // 参数1:组件名称 参数2:组件的配置对象
- Vue.component("login", {
- template:`
用户登录
` // 用来书写该组件的html代码 - }) // 全局组件,任何地方都可用
-
-
- //使用组件
- new Vue({
- el: "#app",
- data: {},
- ...
- components:{
- add:{ // 注册局部组件
- template:`
用户添加
`, - data(){ // 用来定义组件自己的数据 ,然后再template的html代码中可以直接用{{}}进行取值
- return {}
- },
- methods:{}, // 用来定义自己的相关方法
- computed:{}, // 用来定义自己的计算属性
- components:{}, // 用来定义自己的子组件
- beforeCreate(){} // 用来定义自己的生命周期方法
- ....
- }
- } // 只能在当前组件中使用局部组件
- })
-
- // 使用局部组件
注意:无论使用全局组件还是局部组件都必须在template中加入唯一根元素,例如:
- <login title="我是标题">login> # key=value 传递静态数据
-
-
- const app = new Vue({
- el:"#app",
- data:{},
- components:{ // 创建子组件
- login:{
- template:`<div><h3>用户登录组件-->{{title}}h3>div>`, // 使用title
- data(){return {}},
- props:["title"] // 用来接收父组件给当前组件传递数据 注意:props机制接收数据相当于自己组件data中声明一个这样数据
- }
- }
- })
- <login :title="title">login> # v-bind方式
- <input type="text" v-model="title"> # v-model方式
-
-
- const app = new Vue({
- el:"#app",
- data:{
- title: 我是vue实例管理数据(动态数据)
- },
- components:{ // 创建子组件
- login
- }
- })
-
-
- // 将组件拎出来写也可以
- const login={
- template:`<div><h3>用户登录组件-->{{title}}h3>div>`, // 使用title
- data(){return {}},
- props:["title"] // 用来接收父组件给当前组件传递数据 注意:props机制接收数据相当于自己组件data中声明一个这样数据
- }
在使用组件时向子组件传递事件,直接在对应组件标签上定义传递事件即可,例如:@传递事件名="父组件中传递事件名"(@key=value)
- <login :title="title" @testParent="testParent">login> # v-bind方式
-
-
- const app = new Vue({
- el:"#app",
- data:{
- title: 我是vue实例管理数据(动态数据)
- },
- methods:{
- // 定义父组件中事件
- testParent(){
- alert("我是父组件上事件")
- }
- }
- components:{ // 创建子组件
- login
- }
- })
-
-
- // 将组件拎出来写也可以
- const login={
- template:`<div><h3>用户登录组件-->{{title}}<button @click="testChild">点我去调父组件中某个事件button>h3>div>`, // 使用title
- data(){return {}},
- props:["title"] // 用来接收父组件给当前组件传递数据 注意:props机制接收数据相当于自己组件data中声明一个这样数据
- methods:{
- testChild(){
- alert("我是子组件中定义事件")
- // 调用父组件中testParent事件
- this.$emit("testParent") // 这个方法用来调用父组件传递过来事件 参数1:调用事件名
- }
- }
- }
通过定义传递事件的形式,将子组件中需要传递的值通过事件参数的形式传向父组件即可
- <login :title="title" @aaa="testParent">login> # v-bind方式
-
-
- const app = new Vue({
- el:"#app",
- data:{
- title: 我是vue实例管理数据(动态数据)
- count: 0 // 定义父组件需要接收子组件的参数
- },
- methods:{
- // 定义父组件中事件
- testParent(count){
- alert("我是父组件上事件")
- this.count=count // 接收子组件参数
- }
- }
- components:{ // 创建子组件
- login
- }
- })
-
-
- // 将组件拎出来写也可以
- const login={
- template:`<div><h3>用户登录组件-->{{title}}<button @click="testChild">点我去调父组件中某个事件button>h3>div>`, // 使用title
- data(){
- return {
- counter: 12 // 子组件中定义的参数,将这个参数传回父组件
- }
- },
- props:["title"] // 用来接收父组件给当前组件传递数据 注意:props机制接收数据相当于自己组件data中声明一个这样数据
- methods:{
- testChild(){
- alert("我是子组件中定义事件")
- // 调用父组件中aaa事件
- this.$emit("aaa", this.counter) // 这个方法用来调用父组件传递过来事件 参数1:调用事件名, 参数2, 参数3
-
- // this.$emit("bb", {id:1, name:2}) // 传递一个对象也可以
- }
- }
- }
作用:用来扩展现有组件,让组件更灵活使用
具名插槽:带有名字插槽
- <login>login> # 未使用插槽
- <hr>
-
- <login><span slot="bb">欢迎进入我们网站span>login> #使用插槽bb
- <hr>
-
- <login><span slot="aa">welcome to websitespan>login> # 使用插槽aa
-
-
- const app = new Vue({
- el:"#app",
- data:{},
- components:{ // 创建子组件
- login
- }
- })
-
-
- // 将组件拎出来写也可以
- const login={
- template:`<div><slot name="aa">slot><h3>用户登录h3><slot name="bb">slot>div>`, // 定义两个插槽 aa和bb
- data(){return {}}
-
- }