首頁  >  文章  >  web前端  >  使用Vue3.0收穫的知識點(一)

使用Vue3.0收穫的知識點(一)

coldplay.xixi
coldplay.xixi轉載
2020-09-08 13:40:453164瀏覽

使用Vue3.0收穫的知識點(一)

相關學習推薦:javascript影片教學

前端發展百花放,一技未熟百技出。 茫然不知何下手,關注小編勝百書。

近期工作感覺很忙,都沒有多少時間去寫文章,今天這篇文章主要是將自己前期學習Vue3.0時候整理的一些筆記內容進行了總結,透過對本文的閱讀,你將可以自己完成Vue3.0環境搭建,同時還會對Vue3.0的一些新的特性進行了解,方便自己進行Vue3.0的學習。本文首刊於公眾號【前端有的玩】,追蹤===會了,還有更多面試題等你來刷喔。

本文所有的範例都使用ant design vue2.0實現,關於ant design vue2.0請參考2x.antdv.com/docs/ vue/in…

初始化環境

在前面的文章中,我們透過vite建立了一個開發環境,但實際上現在vite 並沒有完善到支撐一個完整專案的地步,所以本文我們依然選擇使用vue-cli鷹架進行環境搭建。

小編使用的vue-cli版本是4.5.4,如果您的版本比較舊可以透過npm update @vue/ cli來升級鷹架版本,如果沒有安裝可以透過npm install @vue/cli -g進行安裝

使用腳手架新項目

  1. #在工作空間開啟終端(cmd),然後透過vue create my-vue3-test 指令初始化項目

  2. ##在第一步先選擇

    Manually select features,進行手動選擇功能

  3. #然後透過

    Space和上下鍵依序選擇

    Choose Vue version
    Babel
    TypeScript
    Router
    Vuex
    CSS Pre-processors
    Linter/Formatter复制代码

    然後回車

      然後提示選擇
    1. Vue版本,選擇3.x(Preview)
    2. Use class -style component syntax?選擇n,即輸​​入n然後回車
    3. 然後提示
    4. Use Babel alongside TypeScript,輸入y `
    5. Use history mode for router#輸入n
    6. 然後
    7. css預處理器選擇Less
    8. eslint選擇ESLint Prettier
    9. 然後是
    10. Lint on saveIn dedicater config files
    11. 最後一路回車即可完成專案搭建
啟動專案

新建完專案之後,進入專案

cd my-vue3-test,然後執行yarn serve即可啟動專案

啟動之後即可透過存取

http://localhost:8080/訪問項目

配置

ant design vue

在當前

Vue3.0正式版還未發布之際,國內比較有名的前端UI庫中率先將Vue3.0繼承到自家的UI庫中的,PC端主要是ant-design -vue,行動端主要是vant, 本文所有範例程式碼都會基於ant-design-vue來進行,首先我們先安裝ant-design-vue

  1. 安裝依賴

    yarn add ant-design-vue@2.0.0-beta.6
    yarn add babel-plugin-import -D复制代码

  2. #設定

    ant-design-vue按需載入

    進入專案根目錄,然後開啟

    babel.config.js文件,將裡面的內容修改為

    module.exports = {  presets: ["@vue/cli-plugin-babel/preset"],  plugins: [    // 按需加载
        [      "import",      // style 为 true 加载 less文件
          { libraryName: "ant-design-vue", libraryDirectory: "es", style: "css" }
        ]
      ]
    };复制代码

  3. 嘗試使用

    vue3 antdv#來新增一個小頁面, 我們直接將views/Home.vue文件裡面的程式碼替換為

    <template>
      <a-form layout="inline" :model="state.form">
        <a-form-item>
          <a-input v-model:value="state.form.user" placeholder="Username">
            <template v-slot:prefix
              ><UserOutlined style="color:rgba(0,0,0,.25)"
            /></template>
          </a-input>
        </a-form-item>
        <a-form-item>
          <a-input
            v-model:value="state.form.password"
            type="password"
            placeholder="Password"
          >
            <template v-slot:prefix
              ><LockOutlined style="color:rgba(0,0,0,.25)"
            /></template>
          </a-input>
        </a-form-item>
        <a-form-item>
          <a-button
            type="primary"
            :disabled="state.form.user === &#39;&#39; || state.form.password === &#39;&#39;"
            @click="handleSubmit"
          >
            登录      </a-button>
        </a-form-item>
      </a-form></template><script>import { UserOutlined, LockOutlined } from "@ant-design/icons-vue";import { Form, Input, Button } from "ant-design-vue";import { reactive } from "vue";export default {  components: {
        UserOutlined,
        LockOutlined,
        [Form.name]: Form,
        [Form.Item.name]: Form.Item,
        [Input.name]: Input,
        [Button.name]: Button
      },
      setup() {    const state = reactive({      form: {        user: "",        password: ""
          }
        });    function handleSubmit() {      console.log(state.form);
        }    return {
          state,
          handleSubmit
        };
      }
    };</script>复制代码

    然後重啟一下項目,就可以發現已經可以正常使用

    ant- design-vue了。

Vue3.0新體驗之setup

對於

Vue3.0的問世,最吸引大家注意力的便是Vue3 .0Composition API,對於Componsition API,可以說是兩極化特別嚴重,一部分人特別喜歡這個新的設計與開發方式,而另一部分人則感覺使用Composition API很容易寫出來義大利麵式的程式碼(可能這部分人不知道蘭州拉麵吧)。到底Composition API是好是壞,小編不做評論,反正我只是一個搬磚的。而本小節介紹的setup就是Composition API的入口。

setup介绍

setupVue3.0提供的一个新的属性,可以在setup中使用Composition API,在上面的示例代码中我们已经使用到了setup,在上文代码中我们在setup中通过reactive初始化了一个响应式数据,然后通过return返回了一个对象,对象中包含了声明的响应式数据和一个方法,而这些数据就可以直接使用到了template中了,就像上文代码中的那样。关于reactive,我将会在下一小节为你带来说明。

setup 的参数说明

setup函数有两个参数,分别是propscontext

  1. props

    propssetup函数的第一个参数,是组件外部传入进来的属性,与vue2.0props基本是一致的,比如下面代码

    export default {  props: {    value: {      type: String,      default: ""
        }
      },
      setup(props) {    console.log(props.value)
      }
    }复制代码

    但是需要注意的是,在setup中,props是不能使用解构的,即不能将上面的代码改写成

    setup({value}) {    console.log(value)
     }复制代码

    虽然template中使用的是setup返回的对象,但是对于props,我们不需要在setup中返回,而是直接可以在template使用,比如上面的value,可以直接在template写成

    <custom-component :value="value"></custom-component>复制代码
  2. context

    contextsetup函数的第二个参数,context是一个对象,里面包含了三个属性,分别是

    • attrs

      attrsVue2.0this.$attrs是一样的,即外部传入的未在props中定义的属性。对于attrsprops一样,我们不能对attrs使用es6的解构,必须使用attrs.name的写法

    • slots

      slots对应的是组件的插槽,与Vue2.0this.$slots是对应的,与propsattrs一样,slots也是不能解构的。

    • emit

      emit对应的是Vue2.0this.$emit, 即对外暴露事件。

setup 返回值

setup函数一般会返回一个对象,这个对象里面包含了组件模板里面要使用到的data与一些函数或者事件,但是setup也可以返回一个函数,这个函数对应的就是Vue2.0render函数,可以在这个函数里面使用JSX,对于Vue3.0中使用JSX,小编将在后面的系列文章中为您带来更多说明。

最后需要注意的是,不要在setup中使用this,在setup中的this和你真正要用到的this是不同的,通过propscontext基本是可以满足我们的开发需求的。

了解Composition API,先从reactiveref开始

在使用Vue2.0的时候,我们一般声明组件的属性都会像下面的代码一样

export default {
  data() {    return {      name: &#39;子君&#39;,      sex: &#39;男&#39;
    }
  }
}复制代码

然后就可以在需要用到的地方比如computed,watch,methods,template等地方使用,但是这样存在一个比较明显的问题,即我声明data的地方与使用data的地方在代码结构中可能相距很远,有一种君住长江头,我住长江尾,日日思君不见君,共饮一江水的感觉。而Composition API的诞生的一个很重要的原因就是解决这个问题。在尤大大在关于Composition API的动机中是这样描述解决的问题的:

  1. 随着功能的增长,复杂组件的代码变得越来越难以阅读和理解。这种情况在开发人员阅读他人编写的代码时尤为常见。根本原因是 Vue 现有的 API 迫使我们通过选项组织代码,但是有的时候通过逻辑关系组织代码更有意义。
  2. 目前缺少一种简洁且低成本的机制来提取和重用多个组件之间的逻辑。

现在我们先了解一下Compositon API中的reactiveref

介绍reactive

Vue2.6中, 出现了一个新的api,Vue.observer,通过这个api可以创建一个响应式的对象,而reactive就和Vue.ovserver的功能基本是一致的。首先我们先来看一个例子

<template>
  <!--在模板中通过state.name使用setup中返回的数据-->
  <p>{{ state.name }}</p></template><script>import { reactive } from "vue";export default {
  setup() {    // 通过reactive声明一个可响应式的对象
    const state = reactive({      name: "子君"
    });    // 5秒后将子君修改为 前端有的玩
    setTimeout(() => {
      state.name = "前端有的玩";
    }, 1000 * 5);    // 将state添加到一个对象中然后返回
    return {
      state
    };
  }
};</script>复制代码

上面的例子就是reactive的一个基本的用法,我们通过上面的代码可以看到reactiveVue.observer声明可响应式对象的方法是很像的,但是他们之间还是存在一些差别的。我们在使用vue2.0的时候,最常见的一个问题就是经常会遇到一些数据明明修改了值,但是界面却并没有刷新,这时候就需要使用Vue.set来解决,这个问题是因为Vue2.0使用的Object.defineProperty无法监听到某些场景比如新增属性,但是到了Vue3.0中通过Proxy将这个问题解决了,所以我们可以直接在reactive声明的对象上面添加新的属性,一起看看下面的例子

<template>  <p>
    <p>姓名:{{ state.name }}</p>
    <p>公众号:{{ state.gzh }}</p>
  </p></template>
<script>
import { reactive } from "vue";
export default {
  setup() {
    const state = reactive({
      name: "子君"
    });
    // 5秒后新增属性gzh 前端有的玩
    setTimeout(() => {
      state.gzh = "前端有的玩";
    }, 1000 * 5);
    return {
      state
    };
  }
};
</script>复制代码

上面的例子虽然在state中并没有声明gzh属性,但是在5s后我们可以直接给state添加gzh属性,这时候并不需要使用Vue.set来解决新增属性无法响应的问题。

在上面的代码中,reactive通过传入一个对象然后返回了一个state,需要注意的是state与传入的对象是不用的,reactive对原始的对象并没有进行修改,而是返回了一个全新的对象,返回的对象是Proxy的实例。需要注意的是在项目中尽量去使用reactive返回的响应式对象,而不是原始对象。

const obj = {}const state = reactive(obj)// 输出falseconsole.log(obj === state)复制代码

介绍ref

假如现在我们需要在一个函数里面声明用户的信息,那么我们可能会有两种不一样的写法

// 写法1let name = &#39;子君&#39;let gzh = &#39;前端有的玩&#39;// 写法2let userInfo = {  name: &#39;子君&#39;,  gzh: &#39;前端有的玩&#39;}复制代码

上面两种不同的声明方式,我们使用的时候也是不同的,对于写法1我们直接使用变量就可以了,而对于写法2,我们需要写成userInfo.name的方式。我们可以发现userInfo的写法与reactive是比较相似的,而Vue3.0也提供了另一种写法,就像写法1一样,即ref。先来看一个例子。

<template>  <p>
    <p>姓名:{{ name }}</p>
  </p></template>
<script>
import { ref } from "vue";
export default {
  setup() {
    const name = ref("子君");
    console.log(&#39;姓名&#39;,name.value)
    // 5秒后修改name为 前端有的玩
    setTimeout(() => {
      name.value = "前端有的玩";
    }, 1000 * 5);
    return {
      name
    };
  }
};
</script>复制代码

通过上面的代码,可以对比出来reactiveref的区别

  1. reactive传入的是一个对象,返回的是一个响应式对象,而ref传入的是一个基本数据类型(其实引用类型也可以),返回的是传入值的响应式值
  2. reactive获取或修改属性可以直接通过state.prop来操作,而ref返回值需要通过name.value的方式来修改或者读取数据。但是需要注意的是,在template中并不需要通过.value来获取值,这是因为template中已经做了解套。

Vue3.0优雅的使用v-model

v-model并不是vue3.0新推出的新特性,在Vue2.0中我们已经大量的到了v-model,但是V3V2还是有很大的区别的。本节我们将主要为大家带来如何在Vue3.0中使用v-model,Vue3.0中的v-model提供了哪些惊喜以及如何在Vue3.0中自定义v-model

Vue2.0Vue3.0中使用v-model

Vue2.0中如何实现双向数据绑定呢?常用的方式又两种,一种是v-model,另一种是.sync,为什么会有两种呢?这是因为一个组件只能用于一个v-model,但是有的组件需要有多个可以双向响应的数据,所以就出现了.sync。在Vue3.0中为了实现统一,实现了让一个组件可以拥有多个v-model,同时删除掉了.sync。如下面的代码,分别是Vue2.0Vue3.0使用v-model的区别。

  1. Vue2.0中使用v-model

    <template>
      <a-input v-model="value" placeholder="Basic usage" /></template><script>export default {
      data() {    return {      value: &#39;&#39;,
        };
      },
    };</script>复制代码
  1. Vue3.0中使用v-model

    <template>
      <!--在vue3.0中,v-model后面需要跟一个modelValue,即要双向绑定的属性名-->
      <a-input v-model:value="value" placeholder="Basic usage" /></template><script>export default {  // 在Vue3.0中也可以继续使用`Vue2.0`的写法
      data() {    return {      value: &#39;&#39;,
        };
      },
    };</script>复制代码

    vue3.0中,v-model后面需要跟一个modelValue,即要双向绑定的属性名,Vue3.0就是通过给不同的v-model指定不同的modelValue来实现多个v-model。对于v-model的原理,下文将通过自定义v-model来说明。

自定义v-model

使用Vue2.0自定义一个v-model示例
  1. 组件代码
<template>
  <p class="custom-input">
    <input :value="value" @input="$_handleChange" />
  </p></template><script>export default {  props: {    value: {      type: String,      default: &#39;&#39;
    }
  },  methods: {
    $_handleChange(e) {      this.$emit(&#39;input&#39;, e.target.value)
    }
  }
}</script>复制代码
  1. 在代码中使用组件

    <template>
        <custom-input v-model="value"></custom-input></template><script>
        export default {
        data() {      return {        value: &#39;&#39;
          }
        }
      }</script>复制代码

    Vue2.0中我们通过为组件设置名为value属性同时触发名为input的事件来实现的v-model,当然也可以通过model来修改属性名和事件名,可以看我以前的文章中有详解。

使用Vue3.0自定义一个v-model示例
  1. 组件代码

    <template>
      <p class="custom-input">
        <input :value="value" @input="_handleChangeValue" />
      </p></template><script>export default {  props: {    value: {      type: String,      default: ""
        }
      },  name: "CustomInput",
      setup(props, { emit }) {    function _handleChangeValue(e) {      // vue3.0 是通过emit事件名为 update:modelValue来更新v-model的
          emit("update:value", e.target.value);
        }    return {
          _handleChangeValue
        };
      }
    };</script>复制代码
    1. 在代码中使用组件

      <template>
        <!--在使用v-model需要指定modelValue-->
        <custom-input v-model:value="state.inputValue"></custom-input></template><script>import { reactive } from "vue";import CustomInput from "../components/custom-input";export default {  name: "Home",  components: {
          CustomInput
        },
        setup() {    const state = reactive({      inputValue: ""
          });    return {
            state
          };
        }
      };</script>复制代码

    到了Vue3.0中,因为一个组件支持多个v-model,所以v-model的实现方式有了新的改变。首先我们不需要使用固定的属性名和事件名了,在上例中因为是input输入框,属性名我们依然使用的是value,但是也可以是其他任何的比如name,data,val等等,而在值发生变化后对外暴露的事件名变成了update:value,即update:属性名。而在调用组件的地方也就使用了v-model:属性名来区分不同的v-model

总结

在本文中我们主要讲解了开发环境的搭建,setup,reactive,ref,v-model等的介绍,同时通过对比Vue3.0Vue2.0的不同,让大家对Vue3.0有了一定的了解,在下文中我们将为大家带来更多的介绍,比如技术属性,watch,生命周期等等,敬请期待。本文首发于公众号【前端有的玩】,学习Vue,面试刷题,尽在【前端有的玩】,乘兴裸辞心甚爽,面试工作屡遭难。 幸得每日一题伴,点击关注莫偷懒。,下周一新文推送,不见不散。

结语

不要吹灭你的灵感和你的想象力; 不要成为你的模型的奴隶。 ——文森特・梵高

想了解更多编程学习,敬请关注php培训栏目!

以上是使用Vue3.0收穫的知識點(一)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.im。如有侵權,請聯絡admin@php.cn刪除
上一篇:一起認識閉包下一篇:一起認識閉包