Vue 3.0教程(for beginner):基础(上篇)

559 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

Vue 3中的新特性

包含但不限于…

  • 对于复杂组件可提升代码的复用性、可读性和可组织性
  • 在组件中提供了一个setup()给我们使用
  • 组件中支持多个根元素并排
  • 内置Telpeort组件(告别vue 2.0需要通过第三方组件portal-vue曲线救国的尴尬)
  • 内置Suspense组件:可以为加载异步组件提供后备内容
  • 支持typescript:现在可以愉快地使用ts来写vue应用了
  • 自定义组件中支持多v-model指令绑定
  • 提升响应性
  • 更好的性能
<template>
	<header>Header</header>
	<section>{{ app.title }}</section>
	<footer>footer</footer>
</template>

<script>
  import { ref, reactive } from 'vue'

  export default {
    setup() {
      const app = reactive({ title: 'Vue 3 Guide' })

      // 暴露给模板
      return {
        app
      }
    }
  }
</script>

准备vscode开发插件

开启Vue 3之旅

该系列教程使用javascript语言开发,后续会推出基于typescript的教程

新建一个demo目录并引入vue 3

vue3-for-beginner
-- index.html
-- app.js

demo-html.png 点击Live Server即可开启一个本地服务

hello-vue.png

开发vue app

先将html body中的内容改为:

<div id="app"></div>
<script src="./app.js"></script>

在app.js中加入

const app = Vue.createApp({
  template: '<h1>Hello World!</h1>',
})

app.mount('#app')

vue支持通过template参数去设置挂载在div#app中的内容,我们可以看到效果:

hello-vue1.png 但是,我们更倾向于使用vue的模板语法(使用双花括号的形式):

<div id="app">
    <p>{{ title }} - @{{ author }} - {{ age }}</p>
</div>

title我们通过createApp中的data参数暴露出去:

const app = Vue.createApp({
  data() {
    return {
      title: 'Hello Vue 3',
      author: 'lostvita',
      age: 18,
    }
  },
})

app.mount('#app')

hello-vue2.png

注意:我们使用app.mount('#app')将数据挂载到div#app上,在这div之外使用模板语法,vue是无法识别处理的。

处理事件绑定

在dom上使用v-on指令可以绑定事件(如click等),它的值可以是javascript表达式或者函数:

<div id="app">
  <p>{{ title }} - @{{ author }} - {{ age }}</p>
  <button v-on:click="age++">+ age</button>
  <button v-on:click="age--">- age</button>
</div>

vue3事件绑定.gif

简写v-on指令,使用@符号代替:

<button @click="title = 'change title'">更改标题</button>

vue3简写事件绑定.gif

以上我们通过在模板中使用javascript表达式完成了事件绑定,然而,在vue语法中,它支持methods参数定义一系列函数,像data中暴露数据一样提供给模板调用。

const app = Vue.createApp({
  data() {
    return {
      title: 'Hello Vue 3',
      author: 'lostvita',
      age: 18,
    }
  },
  methods: {
    changeTitle(title = '默认标题内容') {
      this.title = title
    },
    increaseAge() {
      this.age++
    },
    decreaseAge() {
      this.age--
    },
  },
})

app.mount('#app')
<div id="app">
  <p>{{ title }} - @{{ author }} - {{ age }}</p>
  <button @click="increaseAge">+ age</button>
  <button @click="decreaseAge">- age</button>
  <button @click="changeTitle('自定义标题内容')">更改标题</button>
</div>

vue3事件绑定js.gif

条件渲染

v-if条件渲染

const app = Vue.createApp({
  data() {
    return {
      showTitle: true,
      title: 'Hello Vue 3',
      author: 'lostvita',
      age: 18,
    }
  },
  methods: {
    toggleTitle() {
      this.showTitle = !this.showTitle
    },
  },
})

app.mount('#app')
<div id="app">
  <p v-if="showTitle">{{ title }} - @{{ author }} - {{ age }}</p>
  <p v-else>title被卸载了</p>
  <button @click="toggleTitle">Toggle Title</button>
</div>

条件渲染v-if.gif

v-show条件渲染

<div id="app">
  <p v-show="showTitle">{{ title }} - @{{ author }} - {{ age }}</p>
  <button @click="toggleTitle">Toggle Title</button>
</div>

条件渲染v-show.gif

v-show跟v-if的区别在于,v-if会把对应dom从document树中移除,v-show则不会,它通过设置css属性display:none;去隐藏dom元素,另外v-else也只跟v-show搭配使用。

如何选择使用v-if还是v-show呢?这里有个基本的判断准则:如果这个dom需要频繁操作隐藏,那么使用v-show;反之不需要频繁操作并且后续不再需要使用该dom元素时,则使用v-if。

未完待续Vue 3.0教程(for beginner):基础(下篇)