vue组件的那些事

一、ES6基础语法

在学习vue组件之前,我们需要具备ES6基础语法的知识。

1、变量声明

原因: 使用var声明变量存在作用范围混淆问题。
在这里插入图片描述
let: 用来声明局部变量
好处: 作用范围严谨,从代码声明处开始到代码块结束为止。
一般在声明基本变量时推荐使用let。

在这里插入图片描述
const:用来声明js中常量
好处: 一旦被赋值不能被修改。
一般在声明js中的对象、数组时推荐使用const。

在这里插入图片描述

2、箭头函数

在使用匿名函数 function(){} 作为参数的时候,推荐使用ES6中箭头函数 (参数,参数)=>{函数体}
在这里插入图片描述

注意:
    1.当箭头函数没有参数或者参数大于1个时,参数必须加入();
    2.当箭头函数只有一个参数时 () 可以省略不写;
    3.当函数体中只有一行代码时函数体{} 可以省略不写;
    4.箭头函数和匿名函数的最大区别:箭头函数没有自己的this,匿名函数存在自己的this

3、模板字符串

在这里插入图片描述

4、对象的定义

如果对象的属性名变量名一致时,只需要写一个即可。
在这里插入图片描述

二、vue中的组件

  • vue推荐的开发方式是基于单页面的应用(SPA:Single Page Application)
  • 什么是SPA? 日后项目中只有一个页面(index.html)
  • 为什么vue推荐使用SPA的开发方式? 一个应用中只能存在一个vue实例
  • 使用现有手段严格遵循SPA存在的问题? 使用单页面开发,代码越来越多不利于后续的维护;在一个页面中完成全部业务功能,导致当前页面每次加载速度缓慢
  • 为了严格遵循SPA的开发方式,在vue中提供了组件(component)

组件的作用:用来减少vue实例对象中的代码量,日后在使用vue的开发过程中,可以根据 不同业务功能将页面划分为不同的多个组件,然后由多个组件去完成整个页面的布局,便于日后使用vue进行开发时页面管理,方便开发人员维护。

1、组件的使用

全局组件的注册和使用

//1.开发全局组件
Vue.component('login',{
  template:'<div><h1>用户登录</h1></div>'
});
//2.使用全局组件  在Vue实例范围内
<login></login>  

注意:
1. Vue.component用来开发全局组件 参数1: 组件的名称 参数2: 组件配置{} template:’ '用来书写组件的html代码 template中必须有且只有一个root元素
2. 使用时需要在Vue的作用范围内根据组件名使用全局组件;
3. 如果在注册组件过程中使用驼峰命名组件的方式,在使用组件时必须将驼峰的所有单词小写加入-线进行使用;

局部组件注册和使用

通过将组件注册给对应Vue实例中一个components属性来完成组件注册,这种方式不会对Vue实例造成累加。

  • 第一种开发方式
//局部组件登录模板声明
let login ={   //具体局部组件名称
  template:'<div><h2>用户登录</h2></div>'
};
const app = new Vue({
  el: "#app",
  data: {},
  methods: {},
  components:{  //用来注册局部组件
    login:login  //注册局部组件
  }
});

//局部组件使用 在Vue实例范围内
<login></login>
  • 第二种开发方式
//1.声明局部组件模板  template 标签 注意:在Vue实例作用范围外声明
  <template id="loginTemplate">
      <h1>用户登录</h1>
  </template>

//2.定义变量用来保存模板配置对象
    let login ={   //具体局部组件名称
        template:'#loginTemplate'  //使用自定义template标签选择器即可
    };

//3.注册组件	
    const app = new Vue({
        el: "#app",
        data: {},
        methods: {},
        components:{  //用来注册局部组件
            login:login  //注册局部组件,也可以直接使用login,
        }
    });

 //4.局部组件使用 在Vue实例范围内
	 <login></login>

2、组件中定义数据和事件等

组件中定义属于组件的数据

//组件声明的配置对象
const login = {
  template:'<div><h1>{{ msg }} </h1><ul><li v-for="item,index in lists">{{ index }}{{ item }}</li></ul></div>',
  data(){   //使用data函数方式定义组件的数据   在templatehtml代码中通过插值表达式直接获取
    return {
      msg:"hello",
      lists:['java','spring','springboot']
    }//组件自己内部数据
  }
}

组件中定义属于组件的方法

 const login={
        template:'<div><input type="button" value="点我触发组件中事件" @click="change"></div>',
        data(){
            return {
                name:'xiaozhang'
            };
        },
        methods:{
            change(){
                alert(this.name)
                alert('触发事件');
            }
        }
    }

1. 组件中定义事件和直接在Vue中定义事件基本一致 直接在组件内部对应的html代码上加入@事件名="函数名"方式即可;
2. 在组件内部使用methods属性用来定义对应的事件函数即可,事件函数中this指向的是当前组件的实例。

组件中定义属于组件的计算属性

const login = {
  template:'<div><h1>{{ squareCount }}</h1></div>',
  data(){   //使用data函数方式定义组件的数据   在templatehtml代码中通过插值表达式直接获取
    return {
      count: 2
    }//组件自己内部数据
  },
  computed: {         //组件的计算属性
       squareCount(){
           return this.count * this.count;
       }
   },
}

组件中使用属于组件的生命周期函数

 //初始化阶段
beforeCreate(){
     console.log("beforeCreate:", this.message);
 },
 created(){
     console.log("created:", this.message);
 },
 beforeMount(){         
     //console.log("beforeMount:", document.getElementById("h2").innerText);
 },
 mounted(){             
     console.log("mounted:", document.getElementById("h2").innerText);
 },
 //运行阶段
 beforeUpdate(){
     console.log("beforeUpdate(vue中的数据):", this.count);
     console.log("页面上的数据:", document.getElementById("h3").innerText);
 },
 updated(){
     console.log("beforeUpdate(vue中的数据):", this.count);
     console.log("页面上的数据:", document.getElementById("h3").innerText);
 },
 //销毁阶段
 beforeDestroy(){
     console.log("beforeDestroy:开始销毁");
 },
 destroyed(){
     console.log("destroyed:销毁完成");
 },

3、组件的数据传递

props的作用:用来给组件传递相应静态数据或者是动态数据。

  • 通过在组件上声明静态数据传递给组件内部
<body>
    <div id="app">
        <!--使用登录组件-->
        <login msg="我是登录组件" title="父组件向子组件传递静态数据"></login>
    </div>
</body>
</html>
<script src="js/vue.js"></script>
<script>
    //定义组件的配置对象
    const login = {
        template: `<div><h2>{{NewMsg}}=={{title}}</h2><reg count="1111"></reg></div>`,
        data(){ //定义组件的数据
            return {
                NewMsg: this.msg,
            };
        },
        props: ['msg','title'],      //使用props接收数据,相当于向data中添加了一个数据
        components: {   //在组件中定义子组件
            reg: {
                template: `<div><h3>{{count}}</h3></div>`,
                props: ['count']
            }
        }
    };
    const app = new Vue({
        el: "#app",
        data: {
          msg: "父组件向子组件传递静态数据"
        },
        methods: {},
        computed: {},
        components: {       //注册局部组件
            login,
        }
    });
</script>
  • 通过在组件上声明动态数据传递给组件内部
<body>
    <div id="app">
        <!--使用登录组件-->
        <login :count="counter" :name="name"></login>
        <input type="text" v-model="counter">
    </div>
</body>
</html>
<script src="js/vue.js"></script>
<script>
    const login = {
        template: `<div><h2>{{count}}====={{name}}</h2></div>`,
        props: ['count','name']
    };
    const app = new Vue({
        el: "#app",
        data: {
            msg: "父组件向子组件传递动态数据",
            counter: 0,
            name: "我是一个组件哈哈哈!"
        },
        components: {       //注册局部组件
            login,
        }
    });
</script>
  • prop的单向数据流

1. 所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。
2. 额外的,每次父级组件发生更新时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。

<body>
    <div id="app">
        <!--使用登录组件-->
        <login :count="counter"></login>
    </div>
</body>
</html>
<script src="js/vue.js"></script>
<script>
    const login = {
        template: `<div><h2>{{count}}</h2> <button @click="increment">点我++</button> </div>`,
        methods: {
            increment(){
                this.count++;
            }
        },
        props: ['count']
    };
    const app = new Vue({
        el: "#app",
        data: {
            msg: "父组件向子组件传递动态数据",
            counter: 0,
        },
        components: {       //注册局部组件
            login,
        }
    });
</script>

在这里插入图片描述
可以使用如下方式避免vue发出的警告

<body>
    <div id="app">
        <!--使用登录组件-->
        <login :count="counter"></login>
    </div>
</body>
</html>
<script src="js/vue.js"></script>
<script>
    const login = {
        template: `<div><h2>{{aaCount}}</h2> <button @click="increment">点我++</button> </div>`,
        data(){
            return {
               aaCount: this.count
            }
        },
        methods: {
            increment(){
               this.aaCount++;
            }
        },
        props: ['count']
    };
    const app = new Vue({
        el: "#app",
        data: {
            msg: "父组件向子组件传递动态数据",
            counter: 0,
        },
        methods: {
        },
        computed: {},
        components: {       //注册局部组件
            login,
        }
    });
</script>

4、组件中的事件传递

向子组件中传递事件并在子组件中调用该事件
在子组件中调用传递过来的相关事件必须使用 this.$emit('函数名') 方式调用

可以理解成子组件向父组件传递数据。

<body>
    <div id="app">
        <!--使用登录组件-->
        <login :message="msg" @aa="testParent"></login>
        <h1>{{count}}</h1>
    </div>
</body>
</html>
<script src="js/vue.js"></script>
<script>
    const login = {
        template: `<div><h1>{{message}}</h1> <button @click="testChild">点我</button> </div>`,
        data(){
            return {
                count:222222
            }
        },
        methods: {
            testChild(){
                console.log('我是子组件中的方法');
                //this.$emit('aa',this.count);
                this.$emit('aa',{id:this.count,name:"小陈",age:23});
            }
        },
        props: ['message']
    };
    const app = new Vue({
        el: "#app",
        data: {
            msg: "vue组件中的事件传递",
            count:20
        },
        methods: {
            testParent(user){
                console.log('我是父组件中的方法');
                this.count = user.id;
                console.log(user.id);
                console.log(user.name);
                console.log(user.age);
            }
        },
        components: {       //注册局部组件
            login,
        }
    });
</script>

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值