Vue组件

1.组件的基本使用

在这里插入图片描述

组件可以理解为一个模块,当这个模块需要重复使用时,定义为组件,在其他页面中也可以注册组件并引用

比如下面案例中点击计数的按钮,定义为组件后多次使用更为方便

案例:

<!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>vue</title>
    <script src="../JS/vue.js"></script>
  </head>
  <body>
    <div id="root">
      <counter></counter>
      <counter></counter>
    </div>
    <script>
      // 定义组件
      const counterTemp = {
        template: `<button @click="num++">你点击了{{num}}次}</button>`,
        // 定义组件使用到的数据属性
        data() {
          return {
            num: 0,
          };
        },
      };

      // 全局注册组件:在所有的vue实例中都可以使用组件
      // 参数1:组件名称
      // 参数2:具体的组件
      // Vue.component("counter",counterTemp)

      var vm = new Vue({
        el: "#root",
        // 局部注册组件:只能在当前Vue实例中使用
        components: {
          // 组件名称:具体组件
          counter: counterTemp,
        },
      });
    </script>
  </body>
</html>

组件的定义必须放在Vue创建对象之前

子与父组件之间无法直接使用对方数据,所以为了达成父组件向子组件通信,要让子组件中的属性与父组件中的属性进行关联绑定, 然后子组件使用该属性, 这样才能做到数据传递

2.父组件向子组件通信

<!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>vue</title>
    <script src="../JS/vue.js"></script>
  </head>
  <body>
    <div id="root">
      <!-- 把父组件中的count传递给子组件中的number属性 -->
      <aaa :number="count" :ids="arr" :person="p"></aaa>
    </div>

    <script>
      var aaa = {
        // 定义组件的模板
        template: `<h2>{{num}}---{{number}}---{{ids}}---{{person}}</h2>`,
        // 定义组件中使用到的数据属性
        data() {
          return {
            num: 0,
          };
        },
        // 给组件添加属性
        props: {
          number: "",
          // 数组属性
          ids: [],
          // 对象属性
          person: {}
        },
      };

      // 注册:全局注册
      // "组件名称",具体组件
      Vue.component("aaa", aaa);

      var vm = new Vue({
        el: "root",
        // 定义父组件的数据
        data: {
          count: 5,
          arr: [1, 2, 3],
          p: { username: "mkbk", age: 23 },
        },
      });
    </script>
  </body>
</html>

3.子组件向父组件通信

子组件调用父组件的方法,进而影响到父组件中的数据

<div id="app">
    <h1>父组件中:app_num={{app_num}}</h1>
    <!-- 把父组件的add方法,绑定给子组件的aaa属性,绑定方法使用@属性名="方法名" -->
    <!-- 把父组件的rem方法,绑定给子组件的bbb属性,绑定方法使用@属性名="方法名 -->
    <!-- 把父组件的app_num变量,绑定给子组件的counter_num属性,绑定变量使用:属性名="方法名 -->
    <counter @aaa="add" @bbb="rem" :counter_num="app_num"></counter>
</div>

<script>
    //定义一个组件(模版)
    let counter = {
        template: `
             <div>
                   <h1>子组件中:counter_num={{counter_num}}</h1>
                   <input type="button" @click="fun1" value="+"/>
                   <input type="button" @click="fun2" value="-"/>
            </div>
                `,
        props:{
            //定义属性counter_num,用来接收父组件传递的数据
            counter_num:null,
            //定义aaa属性,用来绑定父组件的方法,当然,该定义也可以省略
            aaa:function(){},
            //定义bbb属性,用来绑定父组件的方法,当然,该定义也可以省略
            bbb:function(){},
        },       
        methods:{
            fun1(){
                //找到aaa属性所绑定的那个方法,执行那个方法
                return this.$emit("aaa");
            },
            fun2(){
                //找到bbb属性所绑定的那个方法,执行那个方法
                return this.$emit("bbb");
            }
        }
    }

    var app = new Vue({
        el: '#app',
        data: {
            app_num: 0
        },
        components: {
            counter
        },
        methods:{
            add(){
                this.app_num++;
            },
            rem(){
                this.app_num--;
            }
        }
    });
</script>

4.组件的嵌套

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>组件的嵌套</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		//定义student组件
		const student = Vue.extend({
			name:'student',
			template:`
				<div>
					<h2>学生姓名:{{name}}</h2>	
					<h2>学生年龄:{{age}}</h2>	
				</div>
			`,
			data(){
				return {
					name:'123',
					age:18
				}
			}
		})
		
		//定义school组件
		const school = Vue.extend({
			name:'school',
			template:`
				<div>
					<h2>学校名称:{{name}}</h2>	
					<h2>学校地址:{{address}}</h2>	
					<student></student>
				</div>
			`,
			data(){
				return {
					name:'123',
					address:'123'
				}
			},
			//注册组件(局部)
			components:{
				student
			}
		})

		//定义hello组件
		const hello = Vue.extend({
			template:`<h1>{{msg}}</h1>`,
			data(){
				return {
					msg:'welcome'
				}
			}
		})
		
		//定义app组件
		const app = Vue.extend({
			template:`
				<div>	
					<hello></hello>
					<school></school>
				</div>
			`,
			components:{
				school,
				hello
			}
		})

		//创建vm
		new Vue({
			template:'<app></app>',
			el:'#root',
			//注册组件(局部)
			components:{app}
		})
	</script>
</html>

5.单文件组件

意义:需避免单个界面的功能过于复杂的情况
作用:复用编码,简化项目编程,提高运行效率

  • School.vue:
<template>
    <div id='Demo'>
        <h2>学校名称:{{name}}</h2>
        <h2>学校地址:{{address}}</h2>
        <button @click="showName">点我提示学校名</button>
    </div>
</template>

<script>
    export default {
        name:'School',
        data() {
            return {
                name:'123',
                address:'123'
            }
        },
        methods: {
            showName(){
                alert(this.name)
            }
        },
    }
</script>

<style>
    #Demo{
        background: orange;
    }
</style>

  • Student.vue:
<template>
    <div>
        <h2>学生姓名:{{name}}</h2>
        <h2>学生年龄:{{age}}</h2>
    </div>
</template>

<script>
    export default {
        name:'Student',
        data() {
            return {
                name:'JOJO',
                age:20
            }
        },
    }
</script>

  • App.vue:
<template>
    <div>
        <School></School>
        <Student></Student>
    </div>
</template>

<script>
    import School from './School.vue'
    import Student from './Student.vue'

    export default {
        name:'App',
        components:{
            School,
            Student
        }
    }
</script>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值