Vue—怎样编写代码,Vue3的基本语法

简介: 本章我们将学习Vue的基本语法,着重学习如何编写代码Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层组件实例的数据。所有 Vue.js 的模板都是合法的 HTML,所以能被遵循规范的浏览器和 HTML 解析器解析。Vue 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统。

本章我们将学习Vue的基本语法,着重学习如何编写代码

Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层组件实例的数据。所有 Vue.js 的模板都是合法的 HTML,所以能被遵循规范的浏览器和 HTML 解析器解析。Vue 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统。

结合响应系统,在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上。

Hello Vue!

刚开始学习 Vue,更简单的方式是直接在页面引入 vue.global.js 文件来测试学习。

Vue3 中的应用是通过使用 createApp 函数来创建的const app = Vue.createApp({ /* 选项 */ }),传递给 createApp 的选项用于配置根组件。在使用 mount() 挂载应用时,该组件被用作渲染的起点:Vue.createApp(HelloVueApp).mount('#hello-vue')

以上代码使用 mount('#hello-vue') 将 Vue 应用 HelloVueApp 挂载到 <div id="hello-vue"></div> 中。

index.html:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello Vue!</title>
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="hello-vue" class="demo">
  {{ message }}
</div>
<script>
const HelloVueApp = {
  data() {
    return {
      message: 'Hello Vue!!'
    }
  }
}
Vue.createApp(HelloVueApp).mount('#hello-vue')
</script>
</body>
</html>

mount('#hello-vue') 将 Vue 应用 HelloVueApp 挂载到 <div id="hello-vue"> 中。

{{ }} 用于输出对象属性和函数返回值。

{{ message }} 对应应用中 message 的值。

初识.vue

在学习语法前,首先我们要了解什么是.vue文件?

我们用 vue-cli 脚手架搭建的项目,里面有见到 index.vue 或者 App.vue 。

如此类的*.vue 文件,叫Vue 单文件组件(缩写为 SFC)是一种特殊的文件格式,它允许将 Vue 组件的模板、逻辑 与 样式封装在单个文件中。Vue SFC 是经典的 HTML、CSS 与 JavaScript 三个经典组合的自然延伸每个.vue文件包含三种类型的顶级语言块 <template>, <script> 和 <style>。这三个部分分别代表了 html,js,css。

下面是一个经典的示例:

<template>
  <div class="example">{{ msg }}</div>
</template>
<script>
export default {
  data() {
    return {
      msg: 'Hello world!'
    }
  }
}
</script>
<style>
.example {
  color: red;
}
</style>
<custom1>
  这里可以是,例如:组件的文档
</custom1>

template:一个 vue 组件,他的 template 则代表它的 html 结构,需要注意的是不能仅仅代码包裹在 <template></template> 中,而是应该在里面放置一个额外的 html 标签来包裹所有的代码:比如div。

script:而<script></script>则好理解,其就是放置js的部分,除了需要引用的文件,我们将所有的代码包裹于如下的代码中间。

export default {
   // 这里写你的代码,外面要包起来。
}

script里面可以包括: data () 、created ()和 methods: 。data是我们的数据。created 表示当我们的组件加载完成时,需要执行的内容。另外created是vuejs中的钩子函数之一。methods是我们的这个组件的方法,也可以说是函数。关于这些的语法后面示例中会用到。

虽然 SFC 需要一个构建步骤,但益处颇多:

使用熟悉的 HTML、CSS 与 JavaScript 语法编写模块化组件

预编译模板

组件作用域 CSS

使用 Composition API 时更符合人体工程学的语法

通过交叉分析模板与脚本进行更多编译时优化

IDE 支持 模板表达式的自动补全与类型检查

开箱即用的热模块更换(HMR)支持

而以下的语法讲解示例均使用单文件组件,仅供参考,也可以选择使用常规html在页面引入 vue.global.js 文件来测试学习,语法上面大同小异,仅代码的结构上有些许差别。

插值表达式:{{}}

双大括号{{}}是数据绑定最常见的形式,双大括号{{}}内的标签将会被替代为对应组件实例中属性的值。如果属性的值在任何时间发生了改变,插值处展示的内容都会更新。

Test.vue

<template>
  <div id="test">
    <h1>test页面</h1>
    <h2>{{ message }}</h2>
  </div>
</template>
<script>
export default {
  name: "Test",
  data() {
    return {
      message: "hello vue!",
    };
  },
};
</script>

首先在双大括号添加变量名message,在js代码中用函数将message定义为hello vue!从而将其绑定。

在这里插入图片描述  

双向数据绑定:v-model

v-model 指令用来在 input、select、textarea、checkbox、radio 等表单控件元素上创建双向数据绑定,根据表单上的值,自动更新绑定的元素的值。

如:在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定:

<template>
  <div id="test">
    <h1>test页面</h1>
    <h2>{{ message }}</h2>
    <input type="text" v-model="message" />
  </div>
</template>
<script>
export default {
  name: "Test",
  data() {
    return {
      message: "hello vue!",
    };
  },
};
</script>

首先使用插值表达式{{}},在双大括号添加变量名message,然后在输入框中插入v-model,并绑定变量message。此时输入值可以即时显示。

在这里插入图片描述

动态绑定属性:v-bind

v-bind:属性,可以简写为 :属性,以下是部分例子:

v-bind:title

<template>
<div id="test"></div>
<div v-bind:title = "msg">鼠标悬停查看动态绑定提示信息</div>
</template>
<script>
export default {
  name: "Test",
  data() {
    return {
      msg: "页面加载于" + new Date().toLocaleString(),
    };
  },
};
</script>

title 属性规定关于元素的额外信息。这些信息通常会在鼠标移到元素上时显示一段工具提示文本(tooltip text)。 v-bind:title动态绑定了title属性,msg使用到Date().toLocaleString()得到本地时间。

在这里插入图片描述

v-bind:href

<template>
  <div id="test">
    <a v-bind:href="url">武汉理工大学</a>
  </div>
</template>
<script>
export default {
  name: "Test",
  data() {
    return {
      url: "http://www.whut.edu.cn",
    };
  },
};
</script>

v-bind:src

<template>
<div id="test"></div>
<img src="../assets/logo.png">
<img :src = "img_src1">
<img :src = "img_src2">
</template>
<script>
import img1 from "../assets/logo.png";
export default {
  name: "Test",
  data() {
    return {
      img_src1: img1,
      img_src2: require("../assets/logo.png"),
    };
  },
};
</script>

原生写法(直接使用相对路径) img src="../assets/logo.png"

方法1:使用import导入静态资源

import img1 from "../assets/logo.png"

img_src1: img1

方法2: require("相对路径")

img_src2: require("../assets/logo.png")

在这里插入图片描述  

v-bind:class

样式的绑定 :class

<template>
  <div id="test">
    <div :class="classObj2">武汉科技大学</div>
  </div>
</template>
<script>
export default {
  name: "Test",
  data() {
    return {
      classObj2: {
        active: true,
        "text-danger": true,
      },
    };
  },
};
</script>
<style scoped>
.active {
  width: 300px;
  height: 50px;
  line-height: 50px;
  margin: 20px auto;
  background-color: #eee;
}
.text-danger {
  background-color: red;
}
</style>

style scoped 表示scoped 表示样式只在本页面中起作用

根据条件展示元素:v-show

v-show=true时显示,为false时不显示。

如下设置,当输入字符中含有hello时则在下方显示输入内容,否则不显示。

<template>
  <div id="test">
    <input type="text" v-model="message" />
    <h2 v-show="message.indexOf('hello') >= 0">{{ message }}</h2>
  </div>
</template>
<script>
export default {
  name: "Test",
  data() {
    return {
      message: "hello vue!",
    };
  },
};
</script>

message.indexOf('hello') >= 0表示 当输入的字符串至少包含一个hello时为true。

在这里插入图片描述

根据条件渲染元素:v-if

v-if,为false 时,标签不渲染(DOM中不存在)

<template>
  <div id="test">
    <h2 v-if="flag">{{ message }}</h2>
  </div>
</template>
<script>
export default {
  name: "Test",
  data() {
    return {
      message: "hello vue!",
      flag: true,
    };
  },
};
</script>

v-if和v-show的区别:

v-if是通过控制dom节点的存在与否来控制元素的显隐;v-show是通过设置DOM元素的display样式,block为显示,none为隐藏

v-if切换有一个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的事件监听和子组件;v-show只是简单的基于css切换;

总结来说:v-if显示隐藏是将dom元素整个添加或删除,而v-show隐藏则是为该元素添加css--display:none,dom元素还在

基于以上区别,因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。

v-if 的“else 块”:v-else

与v-if相呼应,当if中的flag为false时,渲染else块里的元素

<template>
  <div id="test">
    <h2 v-if="flag">{{ message }}</h2>
    <h2 v-else>{{ message.split("").reverse().join("") }}</h2>
  </div>
</template>
<script>
export default {
  name: "Test",
  data() {
    return {
      message: "hello vue!",
      flag: false,
    };
  },
};
</script>

循环遍历:v-for

<template>
  <div id="test">
    <ul v-for="item in url_list" :key="item.url" style="list-style-type: none">
      <li>
        <a :href="item.url"> {{ item.university }} </a>
      </li>
    </ul>
  </div>
</template>
 <script>
export default {
  name: "Test",
  data() {
    return {
      message: "hello vue!",
      flag: true,
      url_list: [
        {
          url: "http://www.whut.edu.cn",
          university: "武汉理工大学",
        },
        {
          url: "http://www.hust.edu.cn",
          university: "华中科技大学",
        },
        {
          url: "http://www.whu.edu.cn",
          university: "武汉大学",
        },
      ],
    };
  },
};
</script>

v-for="item in url_list"循环遍历url_list

url_list 是一个对象集合,需要绑定一个key值

在这里插入图片描述

循环遍历:v-for的更多用法可见:Vue3循环语句的若干用法

绑定事件的监听器:v-on

v-on:事件,简写为 @事件

<template>
  <div id="test">
    <button v-on:click="add">测试1</button>
    <button @click="show = !show">测试2</button>
    <div v-if="show">hello vue!</div>
  </div>
</template>
<script>
export default {
  name: "Test",
  data() {
    return {
      count: 0,
      show: false,
    };
  },
  methods: {
    add: function () {
      this.count++;
      alert(this.count);
    },
  },
};
</script>

v-on:click="add"绑定add事件 v-on:click表示每次点击则调用一次add事件

@click="show = !show"表示每次点击后将show改为!show(真改为假、假改为真)

相关文章
|
3天前
|
JavaScript
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
这篇文章介绍了在Vue项目中如何实现执行删除等危险操作时的二次确认机制,使用Element UI的`el-popconfirm`组件来弹出确认框,确保用户在二次确认后才会执行删除操作。
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
|
3天前
|
JavaScript
如何创建一个Vue项目(手把手教你)
这篇文章是一篇手把手教读者如何创建Vue项目的教程,包括使用管理员身份打开命令行窗口、找到存放项目的位置、通过vue-cli初始化项目、填写项目信息、进入项目目录、启动项目等步骤,并提供了一些常见第三方库的引入方法。
如何创建一个Vue项目(手把手教你)
|
3天前
|
前端开发
StringBoot+Vue实现游客或用户未登录系统前、可以浏览商品等信息、但是不能购买商品或者加入购物车等操作。登录系统显示用户的登录名(源码+讲解)
这篇文章介绍了使用StringBoot+Vue实现用户登录状态判断的方法,包括前端加载用户信息和后端设置session的源码示例。
|
3天前
|
JavaScript 算法 API
Vue 3有哪些新特性
【8月更文挑战第16天】Vue 3有哪些新特性
15 1
|
3天前
|
JavaScript
如何在Vue页面中引入img下的图片作为背景图。../的使用
这篇文章介绍了在Vue页面中如何引入`img`目录下的图片作为背景图,提供了两种使用相对路径的方法。第一种是使用`../assets/img/`作为路径引入图片,第二种是使用`../../assets/img/`作为路径。文章还展示了使用这些方法的代码实现和效果展示,并鼓励读者学无止境。
如何在Vue页面中引入img下的图片作为背景图。../的使用
|
3天前
|
JavaScript
如何查看Vue使用的版本
这篇文章介绍了如何在项目中查看Vue及其相关库的版本信息,比如element-ui和element-china-area-data。要查看Vue的版本,需要查看项目中的`package.json`文件,在`dependencies`部分可以找到Vue的版本号。如果需要查询不同版本的兼容性,可以访问相应的官方文档或资源网站。
|
3天前
|
存储 JavaScript 前端开发
Vue中如何通过三元运算符来展示不同的操作
这篇文章讲述了在Vue中如何使用三元运算符结合v-if指令来根据订单的不同状态展示不同的操作按钮,例如在待发货状态显示退款按钮,在待付款或完成状态显示删除按钮。
|
JavaScript UED 前端开发
Vue1.0常用语法
var vm = new Vue({   el: "选择器", 挂载到页面的那个元素里,即确定vue的作用范围 外部可通过vm.$el访问,得到的是一个原生dom元素,可进行对应操作   a: '', //自定义属性 外部可通过vm.$options访问   data: {
3550 0
|
3天前
|
JavaScript 编译器
成功解决:Module build failed: Error: Vue packages version mismatch
这篇文章记录了解决Vue项目中遇到的"Module build failed: Error: Vue packages version mismatch"错误的步骤,原因是项目中Vue依赖的版本不一致,解决方法是删除`node_modules`后重新安装指定版本的Vue和`vue-template-compiler`,确保版本匹配,最终成功运行项目。
成功解决:Module build failed: Error: Vue packages version mismatch
|
3天前
|
JavaScript
在Vue中使用Avue、配置过程以及实际应用
这篇文章介绍了作者在Vue项目中集成Avue组件库的完整过程,包括安装、配置和实际应用,展示了如何利用Avue实现动态表单和数据展示的功能。
在Vue中使用Avue、配置过程以及实际应用