Vue.js With no Tool-Chain

准备

https://vuejs.org/guide/quick-start.html
代码编辑器:VSCode
浏览器开发工具(用于调试):Vue.js devtools
image.png

rkun1@LAPTOP-TUS5FU0D MINGW64 /c/code
$ mkdir VUE-STARTrkun1@LAPTOP-TUS5FU0D MINGW64 /c/code
$ cd VUE-START/rkun1@LAPTOP-TUS5FU0D MINGW64 /c/code/VUE-START
$ code .

创建index.html文件

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><!-- 开发环境版本 --><title>Vue Basics</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"><script src="https://unpkg.com/vue@3"></script>
</head><body><div id="app" class="container"><h1>{{ pageTitle }}</h1><p>{{ content }}</p></div><script>Vue.createApp({data() {return {pageTitle: "Hello,Vue",content: "Welcome to the wonderful world of Vue"}}}).mount('#app')</script>
</body></html>
  1. 引入了 Vue.js 库和 Bootstrap 样式。
  2. 在页面中创建了一个 Vue 应用的根元素(
    )。
  3. 使用 Vue 数据绑定将数据(pageTitlecontent)渲染到页面上。
  4. 在脚本部分使用 Vue.createApp 创建了一个 Vue 应用,并通过 mount 方法将其挂载到具有 id “app” 的元素上。
  5. 定义了两个数据属性 pageTitlecontent,它们分别用于渲染页面上的标题和段落内容。

image.png

使用循环创建内容

index.html

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><!-- 开发环境版本 --><title>Vue Basics</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"><script src="https://unpkg.com/vue@3"></script>
</head><body><nav class="navbar navbar-expand-lg bg-body-tertiary"><div class="container-fluid"><a class="navbar-brand" href="#">My Vue</a><ul class="navbar-nav me-auto mb-2 mb-lg-0"><li v-for="link in links" class="nav-item"><a class="nav-link" aria-current="page" href="#">{{ link }}</a></li></ul></div></nav><div id="app" class="container"><h1>{{ pageTitle }}</h1><p>{{ content }}</p></div><script>Vue.createApp({data() {return {links: ['Home', 'About', 'Contact']}}}).mount('nav')Vue.createApp({data() {return {pageTitle: "Hello,Vue",content: "Welcome to the wonderful world of Vue"}}}).mount('#app')</script>
</body></html>
  1. 新增的部分主要是一个bootstrap简单的导航栏(navbar),以及对导航栏中链接的动态渲染。
  2. v-for=“link in links”:使用 Vue 的 v-for 指令,遍历 links 数组中的每个元素。
  3. 通过 Vue 的数据绑定和循环指令,动态地生成了一个简单的导航栏,链接的文本内容来自于 links 数组。

image.png

绑定数据到属性

index.html

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><!-- 开发环境版本 --><title>Vue Basics</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"><script src="https://unpkg.com/vue@3"></script>
</head><body><nav class="navbar navbar-expand-lg bg-body-tertiary"><div class="container-fluid"><a class="navbar-brand" href="#">My Vue</a><ul class="navbar-nav me-auto mb-2 mb-lg-0"><li v-for="link in links" class="nav-item"><a class="nav-link" aria-current="page" :href="link.url":title="`this link goes to the ${link.text} page`">{{ link.text }}</a></li></ul></div></nav><div id="app" class="container"><h1>{{ pageTitle }}</h1><p>{{ content }}</p></div><script>Vue.createApp({data() {return {links: [{ text: 'Home', url: 'home.html' },{ text: 'About', url: 'about.html' },{ text: 'Contact', url: 'contact.html' },],pageTitle: "Hello,Vue",content: "Welcome to the wonderful world of Vue"}}}).mount('body')</script>
</body></html>
  1. 在导航栏链接的部分,使用了动态绑定(:href:title)来使链接的href属性和title属性动态地从数据中获取。
    • :href=“link.url”:链接的 href 属性被绑定到 link.url,这样每个链接都有不同的目标页面。
    • :title=“this link goes to the ${link.text} page:链接的 title 属性也被绑定到一个动态字符串,以提供更具体的链接说明。
  2. links 数组的数据结构进行了更改,每个链接现在包含了 texturl 两个属性。这使得链接的文本和目标 URL 可以动态配置。

image.png

  • 数据动态变化

image.png
因为没有编写页面,所以点击任意一个导航,都会出现
image.png

设置事件

index.html

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><!-- 开发环境版本 --><title>Vue Basics</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"><script src="https://unpkg.com/vue@3"></script>
</head><body><nav class="navbar navbar-expand-lg bg-body-tertiary"><div class="container-fluid"><a class="navbar-brand" href="#">My Vue</a><ul class="navbar-nav me-auto mb-2 mb-lg-0"><li v-for="(page,index) in pages " class="nav-item"><a class="nav-link" aria-current="page" :href="page.link.url":title="`this link goes to the ${page.link.text} page`" @click.prevent="activePage = index">{{ page.link.text }}</a></li></ul></div></nav><div id="app" class="container"><h1>{{ pages[activePage].pageTitle }}</h1><p>{{ pages[activePage].content }}</p></div><script>Vue.createApp({data() {return {activePage: 0,pages: [{link: { text: 'Home', url: 'index.html' },pageTitle: 'Home Page',content: 'This is the home content'},{link: { text: 'About', url: 'about.html' },pageTitle: 'About Page',content: 'This is the about content'},{link: { text: 'Contact', url: 'contact.html' },pageTitle: 'Contact Page',content: 'This is the Contact content'},]}}}).mount('body')</script>
</body></html>

使用 v-for 遍历 pages 数组中的每个页面,并将其相关信息绑定到导航栏链接。通过 @click.prevent 监听点击事件,当用户点击链接时,更新 activePage 的值为当前页面的索引,从而切换到对应的页面。prevent 修饰符用于防止点击事件的默认行为,例如阻止链接跳转或表单的提交。
@click.prevent=“activePage = index” 这行代码表示当用户点击导航栏中的链接时,将会触发一个点击事件,而 .prevent 修饰符阻止了这个点击事件的默认行为。在这个上下文中,默认行为通常是链接跳转。因此,点击链接时不会像通常一样跳转到链接指定的页面,而是触发了你在 @click 处理函数中定义的逻辑,即更新 activePage 的值为当前页面的索引,实现了页面切换的功能。
image.png
image.png
image.png

绑定CSS样式类

index.html

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><!-- 开发环境版本 --><title>Vue Basics</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"><script src="https://unpkg.com/vue@3"></script>
</head><body><nav class="navbar navbar-expand-lg ":class="{'navbar-light bg-light':!useDarkNavBar ,'navbar-dark bg-dark': useDarkNavBar }"><div class="container-fluid"><a class="navbar-brand" href="#">My Vue</a><ul class="navbar-nav me-auto mb-2 mb-lg-0"><li v-for="(page,index) in pages " class="nav-item"><a class="nav-link" aria-current="page" :href="page.link.url":title="`this link goes to the ${page.link.text} page`" @click.prevent="activePage = index">{{ page.link.text }}</a></li></ul><form class="d-flex"><button class="btn btn-primary" @click.prevent="useDarkNavBar = !useDarkNavBar">Toggle NavBar</button></form></div></nav><div id="app" class="container"><h1>{{ pages[activePage].pageTitle }}</h1><p>{{ pages[activePage].content }}</p></div><script>Vue.createApp({data() {return {useDarkNavBar: false,activePage: 0,pages: [{link: { text: 'Home', url: 'index.html' },pageTitle: 'Home Page',content: 'This is the home content'},{link: { text: 'About', url: 'about.html' },pageTitle: 'About Page',content: 'This is the about content'},{link: { text: 'Contact', url: 'contact.html' },pageTitle: 'Contact Page',content: 'This is the Contact content'},]}}}).mount('body')</script>
</body></html>
  1. 使用了 Vue.js 的动态 class 绑定功能,通过 :class 属性动态地设置 navbar 元素的类,以根据 useDarkNavBar 的值切换不同的样式。
  2. :class 属性,它接受一个对象,对象的键是类名,值是布尔表达式。如果值为 true,则该类名将被应用,如果值为 false,则该类名将被移除。因此,根据 useDarkNavBar 的值,navbar 元素会切换在明亮主题和暗黑主题之间。

image.png
点击按钮,切换样式
image.png

使用Computed Properties

index.html

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><!-- 开发环境版本 --><title>Vue Basics</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"><script src="https://unpkg.com/vue@3"></script>
</head><body><nav class="navbar navbar-expand-lg " :class=navbarClasses><div class="container-fluid"><a class="navbar-brand" href="#">My Vue</a><ul class="navbar-nav me-auto mb-2 mb-lg-0"><li v-for="(page,index) in pages " class="nav-item"><a class="nav-link" aria-current="page" :href="page.link.url":title="`this link goes to the ${page.link.text} page`" @click.prevent="activePage = index">{{ page.link.text }}</a></li></ul><form class="d-flex"><button class="btn btn-primary" @click.prevent="useDarkNavBar = !useDarkNavBar">Toggle NavBar</button></form></div></nav><div id="app" class="container"><h1>{{ pages[activePage].pageTitle }}</h1><p>{{ pages[activePage].content }}</p></div><script>Vue.createApp({computed: {navbarClasses() {return {'navbar-light': !this.useDarkNavBar,'bg-light': !this.useDarkNavBar,'navbar-dark': this.useDarkNavBar,'bg-dark': this.useDarkNavBar,}}},data() {return {useDarkNavBar: false,activePage: 0,pages: [{link: { text: 'Home', url: 'index.html' },pageTitle: 'Home Page',content: 'This is the home content'},{link: { text: 'About', url: 'about.html' },pageTitle: 'About Page',content: 'This is the about content'},{link: { text: 'Contact', url: 'contact.html' },pageTitle: 'Contact Page',content: 'This is the Contact content'},]}}}).mount('body')</script>
</body></html>

Vue.js的computed属性来计算navbarClasses,这是一个基于useDarkNavBar数据属性的计算属性。computed属性允许你在Vue实例中定义依赖于其他响应式数据的属性,这些属性会在其依赖发生变化时自动更新。

image.png
image.png

绑定CSS样式类 II

index.html

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><!-- 开发环境版本 --><title>Vue Basics</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"><script src="https://unpkg.com/vue@3"></script>
</head><body><nav class="navbar navbar-expand-lg " :class="[`navbar-${theme}`,`bg-${theme}`,'navbar','navbar-expand-lg']"><div class="container-fluid"><a class="navbar-brand" href="#">My Vue</a><ul class="navbar-nav me-auto mb-2 mb-lg-0"><li v-for="(page,index) in pages " class="nav-item"><a class="nav-link" aria-current="page" :href="page.link.url":title="`this link goes to the ${page.link.text} page`" @click.prevent="activePage = index">{{ page.link.text }}</a></li></ul><form class="d-flex"><button class="btn btn-primary" @click.prevent="changeTheme()">Toggle NavBar</button></form></div></nav><div id="app" class="container"><h1>{{ pages[activePage].pageTitle }}</h1><p>{{ pages[activePage].content }}</p></div><script>Vue.createApp({data() {return {theme: 'light',activePage: 0,pages: [{link: { text: 'Home', url: 'index.html' },pageTitle: 'Home Page',content: 'This is the home content'},{link: { text: 'About', url: 'about.html' },pageTitle: 'About Page',content: 'This is the about content'},{link: { text: 'Contact', url: 'contact.html' },pageTitle: 'Contact Page',content: 'This is the Contact content'},]};},methods: {changeTheme() {let theme = 'light';if (this.theme == 'light') {theme = 'dark';}this.theme = theme;}}}).mount('body')</script>
</body></html>
  1. changeTheme 方法:这是一个在 Vue 实例的 methods 属性中定义的方法。
  2. let theme = ‘light’;:首先,定义了一个局部变量 theme 并初始化为 ‘light’。
  3. if (this.theme == ‘light’) { theme = ‘dark’; }:检查当前主题是否为 ‘light’,如果是,则将 theme 设置为 ‘dark’,实现了主题的切换。
  4. this.theme = theme;:将更新后的主题应用到 Vue 实例的 theme 数据属性上,触发视图的重新渲染,从而实现导航栏样式的动态切换。

image.png
image.png

组件

index.html

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><!-- 开发环境版本 --><title>Vue Basics</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"><script src="https://unpkg.com/vue@3"></script>
</head><body><nav class="navbar navbar-expand-lg " :class="[`navbar-${theme}`,`bg-${theme}`,'navbar','navbar-expand-lg']"><div class="container-fluid"><a class="navbar-brand" href="#">My Vue</a><ul class="navbar-nav me-auto mb-2 mb-lg-0"><li v-for="(page,index) in pages " class="nav-item"><a class="nav-link" aria-current="page" :href="page.link.url":title="`this link goes to the ${page.link.text} page`" @click.prevent="activePage = index">{{ page.link.text }}</a></li></ul><form class="d-flex"><button class="btn btn-primary" @click.prevent="changeTheme()">Toggle NavBar</button></form></div></nav><page-viewer :page="pages[activePage]"></page-viewer><script>let app = Vue.createApp({data() {return {theme: 'light',activePage: 0,pages: [{link: { text: 'Home', url: 'index.html' },pageTitle: 'Home Page',content: 'This is the home content'},{link: { text: 'About', url: 'about.html' },pageTitle: 'About Page',content: 'This is the about content'},{link: { text: 'Contact', url: 'contact.html' },pageTitle: 'Contact Page',content: 'This is the Contact content'},]};},methods: {changeTheme() {let theme = 'light';if (this.theme == 'light') {theme = 'dark';}this.theme = theme;}}});app.component('page-viewer', {props: ['page'],template: `<div id="app" class="container"><h1>{{page.pageTitle}}</h1><p>{{page.content}}</p></div> `});app.mount('body')</script>
</body></html>

通过 app.component 方法创建了一个名为 page-viewer 的组件。这个组件接受一个名为 page 的 prop,并根据传入的页面信息渲染页面的标题和内容。

  1. app.component(‘page-viewer’, {…}):使用 app.component 方法创建一个名为 page-viewer 的组件。
  2. props: [‘page’]:声明组件的属性 page,这表示 page-viewer 组件可以接受一个名为 page 的 prop。
  3. template:定义了组件的模板。在这里,模板包含了一个 div 元素,其中包含了页面的标题和内容,使用了动态绑定来显示传入的页面信息。
  4. 插值表达式{{page.pageTitle}}{{page.content}} 是插值表达式,用于将 page prop 中的数据动态地显示在组件中。

image.png
image.png
image.png

理解数据流

index.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><title>Vue Basics</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"><script src="https://unpkg.com/vue@3"></script>
</head><body><navbar :pages="pages" :active-page="activePage" :nav-link-click="(index) => activePage = index"></navbar><page-viewer :page="pages[activePage]"></page-viewer><script>const app = Vue.createApp({data() {return {activePage: 0,pages: [{link: { text: 'Home', url: 'index.html' },pageTitle: 'Home Page',content: 'This is the home content'},{link: { text: 'About', url: 'about.html' },pageTitle: 'About Page',content: 'This is the about content'},{link: { text: 'Contact', url: 'contact.html' },pageTitle: 'Contact Page',content: 'This is the Contact content'}]};}});app.component('page-viewer', {props: ['page'],template: `<div id="app" class="container"><h1>{{page.pageTitle}}</h1><p>{{page.content}}</p></div>`});app.component('navbar', {props: ['pages', 'activePage', 'navLinkClick'],template: `<nav class="navbar navbar-expand-lg" :class="{ 'navbar-light': theme === 'light', 'navbar-dark': theme === 'dark', 'bg-light': theme === 'light', 'bg-dark': theme === 'dark' }"><div class="container-fluid"><a class="navbar-brand" href="#">My Vue</a><ul class="navbar-nav me-auto mb-2 mb-lg-0"><li v-for="(page, index) in pages" class="nav-item"><a class="nav-link" :href="page.link.url":title="[\`this link goes to the \${page.link.text} page\`]" @click.prevent="navLinkClick(index)">{{ page.link.text }}</a></li></ul><form class="d-flex"><button class="btn btn-primary" @click.prevent="changeTheme()">Toggle NavBar</button></form></div></nav>`,data() {return {theme: 'light',};},methods: {changeTheme() {this.theme = (this.theme === 'light') ? 'dark' : 'light';}}});app.mount('body');</script>
</body></html>
  • props: 定义了pagesactivePagenavLinkClick作为该组件的属性,这些属性将通过父组件传递给navbar组件。
  • template: 定义了组件的模板,显示一个导航栏,其中包括品牌标识、页面链接以及一个按钮来切换导航栏的主题。
  • data: 定义了组件的数据属性theme,初始值为’light’,用于控制导航栏的主题。
  • methods: 定义了组件的方法changeTheme,用于切换导航栏的主题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/265442.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录 | ubuntu上安装fzf

在 ubuntu 上采用命令行安装 fzf 的方式行不通 指的是采用下面的方式行不通&#xff1a; sudo apt install fzf # 行不通 sudo snap install fzf --classic # 行不通正确的安装方式是&#xff1a; ● 到 fzf 的 git 仓库&#xff1a;https://github.com/junegunn/fzf/re…

字符串String

字符串字面量 let s "hello";变量s属于字符串字面量&#xff0c;它们属于硬编码进程序的字符串值&#xff0c;属于不可变的类型。但并不是所有字符串的值都能够在编写代码时确定。 String类型 String类型会在堆上分配到自己需要的存储空间&#xff0c;所以它能够…

Java项目-瑞吉外卖Day3

填充公共字段&#xff1a; 目的&#xff1a;由于某些属性&#xff0c;例如createdTime这些需要填充的字段会在多个地方出现&#xff0c;所以考虑使用公共字段自动填充的办法减少重复代码。 在对应属性上加入TableField注解。通过fill字段表明策略&#xff0c;是插入/更新的时候…

numpy数据读取保存及速度测试

目录 数据保存及读取 速度比对测试 数据保存及读取 代码示例&#xff1a; # 导入必要的库 import numpy as np # 生成测试数据 arr_disk np.arange(8) # 打印生成能的数据 print(arr_disk) # numpy保存数据到本地 np.save("arr_disk", arr_disk) # 加载本地数据…

java--Arrays类、自定义排序规则Comparable、自定义比较器Comparator

1.Arrays 用来操作数组的一个工具类。 2.Arrays类提供的常见方法 3.如果数组中存储的是对象&#xff0c;如何排序 方法一&#xff1a;让该对象的类实现Comparable(比较规则)接口&#xff0c;然后重写CompareTo方法&#xff0c;自己来定制比较规则。 方法二&#xff1a;使用下…

去除水中的悬浮固体、重金属和各种酸

每个球粒直径通常在2-5毫米范围内 的&#xff0c;可用于固定床吸附污染物。不过球粒尺寸可以根据客户的具体需求生产 TRAPPSORB尽管它与颗粒产品具有相同的化学成分&#xff0c;但由于其独特 的外表面和结构&#xff0c;它与其他基于MgO的材料根本不同&#xff0c; 它由独特的…

Python接口自动化浅析数据驱动原理

以下主要介绍使用openpyxl模块操作excel及结合ddt实现数据驱动。 在此之前&#xff0c;我们已经实现了用unittest框架编写测试用例&#xff0c;实现了请求接口的封装&#xff0c;这样虽然已经可以完成接口的自动化测试&#xff0c;但是其复用性并不高。 我们看到每个方法&…

基于深氮化镓蚀刻的微米尺寸光子器件的研制

引言 GaN和相关合金由于其优异的特性以及大的带隙、高的击穿电场和高的电子饱和速度而成为有吸引力的材料之一&#xff0c;与优化工艺过程相关的成熟材料是有源/无源射频光电子器件近期发展的关键问题。专用于三元结构的干法蚀刻工艺特别重要&#xff0c;因为这种器件通常包括…

2023年【G1工业锅炉司炉】考试及G1工业锅炉司炉作业考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 G1工业锅炉司炉考试参考答案及G1工业锅炉司炉考试试题解析是安全生产模拟考试一点通题库老师及G1工业锅炉司炉操作证已考过的学员汇总&#xff0c;相对有效帮助G1工业锅炉司炉作业考试题库学员顺利通过考试。 1、【多…

源码泄露 [RoarCTF 2019]Easy Java1

打开题目 看见登录框一开始以为是sql注入&#xff0c;试了一下结果不是 我们点击help看看 于此同时url 我们在url上随便输入使其报错 在这里看到了Apache Tomcat/8.5.24 再看一下网站用的是什么服务器 百度搜索得知&#xff0c; openresty是一个基于Nginx的web平台 那我们bp抓…

六级高频词汇3

目录 单词 参考链接 单词 400. nonsense n. 胡说&#xff0c;冒失的行动 401. nuclear a. 核子的&#xff0c;核能的 402. nucleus n. 核 403. retail n. /v. /ad. 零售 404. retain vt. 保留&#xff0c;保持 405. restrict vt. 限制&#xff0c;约束 406. sponsor n. …

request.getSession().getAttribute 获取不到值,获取到的是null

我 | 在这里 &#x1f575;️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 &#x1f3e0; 工作 | 广州 ⭐ Java 全栈开发&#xff08;软件工程师&#xff09; ✈️公众号 | 热爱技术的小郑 。文章底部有个人公众号二维码。回复 Java全套视频教程 或 前端全套视频教程 即可获取 300G 教程资…