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(真改为假、假改为真)

相关文章
|
14天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
117 64
|
14天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
25 8
|
13天前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
19 1
|
13天前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
26 1
|
14天前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
JavaScript UED 前端开发
Vue1.0常用语法
var vm = new Vue({   el: "选择器", 挂载到页面的那个元素里,即确定vue的作用范围 外部可通过vm.$el访问,得到的是一个原生dom元素,可进行对应操作   a: '', //自定义属性 外部可通过vm.$options访问   data: {
3573 0
|
17天前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
19天前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
|
21天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
24 1
vue学习第一章
|
21天前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
22 1
vue学习第三章