美文网首页前端开发那些事儿
vue3.0语法的一些总结

vue3.0语法的一些总结

作者: 焚心123 | 来源:发表于2020-08-22 11:20 被阅读0次
  • 今天我在下载脚手架的时候发现,可以下载Vue3.0的脚手架了,注意:里面可以使用vue2.0的语法,也可以使用vue3.0的语法,而vue3.0的语法不需要我们再去下载并引入@vue/composition-api,我们直接使用ref或者是reactive的时候,脚手架会自动的帮助我们引入,这一点很nice
  • 首先介绍的是生命周期
  • Vue2.0==========》Vue3.0
  • beforeCreate=====》setup
  • created==========》setup
  • beforeMount======》onBeforeMount
  • mounted=========》onMounted
  • beforeUpdate===== 》onBeforeUpdate
  • updated========= 》onUpdated
  • beforeDestroy==== 》onBeforeUnmount
  • destroy========= 》onUnmounted
  • ref和reactive的区别
  • ref:创建一个包装式对象,含有一个响应式属性value(我在百度上看到有的人说,ref只可以监听简单的数据,如数字、字符串、布尔值等,但是我用代码测了一下,他跟reactive的写法可以是一样的,而且他是在新建对象外在创建一个属性可以视图显示的,而reactive内存显示但是视图不更新,有不同意见的,欢迎留言!)
  • reactive:创建一个响应式对象,非包装类,相当于data
  • 我们在来看他们的写法上有何不同
  • ref语法及点击事件
     <h5>{{title}}</h5>这种在页面上数据不会渲染出来
     <mark>{{state1.c}}</mark>要用这种进行渲染
     <mark>{{state1.cc}}</mark>要用这种进行渲染
     <button @click="refXg()">点击修改ref数据</button>
     <block v-for="item in timer1.data" :key="item.balance_id">
       <p>{{item.balance_deal}}---ref</p>
       <p>{{item.aa}}---ref</p>
     </block>
     <button @click="xg()">点击</button>
  import { reactive , toRefs , ref } from 'vue'//这个脚手架会自动生成,没有生成的话,你可以自己加上
  export default {
      setup(){
           let state1=ref({声明变量
                   b:666,
                   c:false
              });
            这是方法的写法
            let refXg=()=>{
                  state1.value.c=!state1.value.c;点击按钮的时候,属性值发生改变==》可以输出
                  state1.value.cc=123;点击按钮的时候,给这个变量新增一个cc的属性,视图可以渲染出来
                  console.log(state1);//打印输出,属性都有
              }
             const timer1=ref({
                    "code":"000",
                     "msg":"成功",
                     "data":[{
                          "flg":1,
                          "deal_time":"2020-08-03 09:26:32",
                          "balance_deal":"+100.00",
                          "balance_id":1,
                        },
                      { "flg":0,
                        "deal_time":"2020-07-31 17:24:01",
                        "balance_deal":"-500.00",
                        "balance_id":1,
                      },
                      { "flg":1,
                        "deal_time":"2020-07-31 17:12:10",
                        "balance_deal":"+1000.00",
                        "balance_id":1,
                      }],
                    "suc":true
                    });
         let xg=()=>{点击按钮的时候,给数据中添加一个aa为false的属性
                timer1.value.data.forEach(v=>{
                v.aa=false;
                })
               }
             return{
                state1,必须要有返回值,而且是直接返回变量
                title:state1.value.c,这种在页面上不会渲染,写法错误
                refXg,返回方法
                timer1,
                xg
              }

        }

    }
  
  • reactive语法及点击事件
     <h5>{{title}}</h5>这种在页面上数据会渲染出来,但是不是响应式的,数据修改好后,页面不会立刻改变视图,需要刷新的时候,才可以显示
     <mark>{{c}}</mark>要用这种进行渲染
     <mark>{{cc}}</mark>这种新增加的属性,没有在视图渲染出来,打印后,内存中显示有数据
     <button @click="refXg()">点击修改reactive数据</button>
     <block v-for="item in data" :key="item.balance_id">
       <p>{{item.balance_deal}}---reactive</p>
       <p>{{item.aa}}---reactive</p>这里的视图会渲染出来
     </block>
     <button @click="xg()">点击</button>
  import { reactive , toRefs , ref } from 'vue'//这个脚手架会自动生成,没有生成的话,你可以自己加上
  export default {
      setup(){
           let state=reactive({声明变量
                   b:666,
                   c:false
              });
            这是方法的写法
            let refXg=()=>{
                  state.c=!state1.c;点击按钮的时候,属性值发生改变==》可以输出
                  state.cc=123;点击按钮的时候,给这个变量新增一个cc的属性,视图不会渲染出来
                  console.log(state);//打印输出,属性都有
              }
             const timer=reactive({
                    "code":"000",
                     "msg":"成功",
                     "data":[{
                          "flg":1,
                          "deal_time":"2020-08-03 09:26:32",
                          "balance_deal":"+100.00",
                          "balance_id":1,
                        },
                      { "flg":0,
                        "deal_time":"2020-07-31 17:24:01",
                        "balance_deal":"-500.00",
                        "balance_id":1,
                      },
                      { "flg":1,
                        "deal_time":"2020-07-31 17:12:10",
                        "balance_deal":"+1000.00",
                        "balance_id":1,
                      }],
                    "suc":true
                    });
         let xg=()=>{点击按钮的时候,给数据中添加一个aa为false的属性
                timer1.data.forEach(v=>{
                v.aa=false;
                })
               }
             return{必须要有返回值,而且是直接返回变量
                ...toRefs(state),这种写法是响应式的,并且可以直接输出属性名
                title:state.c,在页面上可以进行输出,但是不是响应式的,发生改变后,视图不发生改变
                refXg,返回方法
                ...toRefs( timer),
                xg,
                ...state,这种写法也可以渲染,但是也不是响应式的渲染
              }

        }

    }

  • 传值:provide(“a”,值),在子组件中通过const b=inject("a");return{b},他只能是在页面开始就传值了,在点击事件中是不可以进行传值的,控制台显示只能在setup内部进行使用,还有在我们的业务场景中,好像也是不需要的,或者可以用其他的方式进行传参
  • 补充:vue3.0中新增的两个钩子函数
import { onRenderTracked, onRenderTriggered } from 'vue'
在setup中写这两个事件
// 这是状态触发,就是你点击或者是那个数据变化,就会打印出来,只有当前触发的,会将新的value值和旧的value都打印
    // 相比下面的钩子函数,这个更精准一些
    onRenderTriggered((e)=>{
      console.log(e);
    })
    // 状态跟踪钩子函数,只要页面上的数据发生改变就会进行触发
    onRenderTracked((event)=>{
      console.log(event);
    });
  • watch监听ref及reactive声明的变量及监听多个变量
<template>
  <div class="about">
    <h1>watch监听的使用</h1>
    <ul>
      <li>{{overText}}</li>
      <li>{{overText1}}</li>
      <li v-for="(item,index) in list" :key="index">
        <button @click="check(index)">{{item}}</button>
      </li>
      <li>你的选择是【{{user}}】</li>
      <li><button @click="overActive">点餐完毕</button></li>
    </ul>
  </div>
</template>
<script lang="ts">
import { ref, defineComponent, reactive, toRefs, watch } from 'vue'
export default defineComponent({
  name:'about',
  setup(){
    const overText=ref('红浪漫');
    const overText1=ref('红浪漫1');
    const overActive=()=>{
      overText.value=overText.value+'点餐完成!';
      overText1.value='ref'
      // document.title=overText.value;
    }
    const msg=reactive({
      list:['小红','小明','小王'],
      user:'',
      check:(index: number)=>{
        msg.user=msg.list[index]
      }
    })
    //监听多个值得时候,使用数组形式,reactive中的值使用函数写法,ref的可以直接写
    watch([overText,overText1,()=>msg.user],(newValue,oldValue)=>{
      console.log(`new--->${newValue}`);
      console.log(`old--->${oldValue}`);
      document.title = newValue[0];
    })
    return{
      overText,
      overText1,
      overActive,
      ...toRefs(msg)
    }
  }
})
</script>

  • 模块化,如果我们想要在多个组件中进行一个方法复用的话,我们会怎么选择呢?
  • 在vue2.x中我们可能会使用mixin,在vue3.x中,看代码
直接新建一个文件夹userNowTime.js吧,这是我们写的公共的方法
  import { ref } from "vue";

const nowTime = ref("00:00:00");
const getNowTime = () => {
    const now = new Date();
    const hour = now.getHours() < 10 ? "0" + now.getHours() : now.getHours();
    const minu =
        now.getMinutes() < 10 ? "0" + now.getMinutes() : now.getMinutes();
    const sec =
        now.getSeconds() < 10 ? "0" + now.getSeconds() : now.getSeconds();
    nowTime.value = hour + ":" + minu + ":" + sec;

    setTimeout(getNowTime, 1000);
};

export { nowTime, getNowTime }
在about.vue中引入
import {nowTime, getNowTime} from '../assets/userNowTime';
要注意:我们一定要在setup中将我们的方法及变量在return出去,否则会不显示
setup(){
  return{
    nowTime,getNowTime
  }
}
在页面中直接写就可以了
<template>
<mark>{{nowTime}}</mark>
<button @click="getNowTime">开始时间</button>
</template>
  • 封装的函数
  import { ref } from 'vue';
import axios from 'axios';
function userUrlAxios(url: string){
    const result=ref(null);//存储数据
    const loading=ref(true);//显示loading
    const loaded=ref(false);//是否显示图片
    const error=ref(null);//报错提示

    axios.get(url).then(res=>{
        loading.value=false;
        loaded.value=true;
        result.value=res.data;
    }).catch(e=>{
        error.value=e;
        loading.value=false;
    })
    return{
        result,
        loaded,
        loading,
        error
    }
}
export default userUrlAxios;


在使用的页面中进行调用
<template>
    <div>
        <p>我是test页面</p>
        <p>{{title}}</p>
        <p>{{msg}}</p>
        <div v-if="loading">Loading.....</div>
        <img v-if="loaded" :src="result.message" />
    </div>
</template>
<script lang="ts">
import Vue, { defineComponent, onMounted, ref} from 'vue';
import userUrlAxios from '../assets/userAxios';
export default defineComponent({
    name:'test',
    setup(){
        const title=ref('欢迎光临红浪漫洗浴中心');
        const msg=ref('随机出现一张狗狗的图片');
        const { loading, loaded, result} =userUrlAxios("https://dog.ceo/api/breeds/image/random");
        return {
            title,
            msg,
            loading, loaded, result
        }
    }
})
</script>
  • 在脚手架中进行全局注册组件,怎么注册呢?
  • 首先跟我们的vue2.0一样,在components文件下新建一个.vue文件,在main.js中进行引入


    image.png
  • 这是我学习技术胖的vue3.0+ts中的,你们也可以去学习下!

相关文章

  • vue3.0语法的一些总结

    今天我在下载脚手架的时候发现,可以下载Vue3.0的脚手架了,注意:里面可以使用vue2.0的语法,也可以使用vu...

  • Vue3.0语法总结

    Vue3.0-beta链接:https://github.com/vuejs/vue-next#status-be...

  • vue报错处理

    Vue3.0 console.log()语法报错:Unexpected console statement 解决方...

  • vue2.0和3.0的响应式原理以及区别

    前言 自从vue3.0正式上线以来,好多小伙伴都转战vue3.0了,这里把我自己总结的3.0和2.0的原理以及他俩...

  • vue3.2 setup 语法糖常用简介

    提示:Vue3.2 版本开始才能使用语法糖! 在 Vue3.0 中变量必须 return 出来,template中...

  • 一文掌握 vue3.2 setup 语法糖

    提示:Vue3.2 版本开始才能使用语法糖! 在 Vue3.0 中变量必须 return 出来,template中...

  • Vue3.0 新特性

    Vue3.0 在去年9月正式发布了,也有许多小伙伴都热情的拥抱Vue3.0,这篇文章就是在使用后的一个总结, 包含...

  • vue3.x的setup语法糖

    什么是setup语法糖 vue3.0时setup的变量需要return暴露出来,template才能获取。到3.2...

  • 一文掌握 vue3.2 setup 语法糖

    前言 提示:Vue3.2 版本开始才能使用语法糖! 在 Vue3.0 中变量必须 return 出来,templa...

  • vue3.0的基础语法

    新修改获取全局变量的简单的写法,在底部,请进行查看! 首先我们安装vue3.0以上的脚手架全局 创建项目 此时打开...

网友评论

    本文标题:vue3.0语法的一些总结

    本文链接:https://www.haomeiwen.com/subject/cnbsjktx.html