只用了三天就入门了Vue3?

"真的我学Vue3,只是为了完成JAVA课设"


环境配置

使用Vue3要去先下载Node.js。

就像用Python离不开pip包管理器一样。

Node.js — Run JavaScript Everywhere (nodejs.org)

下完Node.js去学习怎么使用npm包管理器,放心你只需要学一些基础的命令行就好了,不会很难,就像pip会个pip install就差不多了。npm教程如下,作者觉得讲的很不错,用最短的时间讲明白了。

【npm 包管理工具教程】 https://www.bilibili.com/video/BV1CQ4y167oc/?share_source=copy_web&vd_source=8080cb5e2e41cde7ff5bda650278c876

 Hello Vue3

我们打开VsCode选择一个文件夹作为工作文件夹,在左上角新建一个终端,在命令行里面输入npm install -g @vue/cli,安装Vue.js。

npm install -g @vue/cli

确定安装好Vue.js后,再在命令行里面输入npm create vue@latest。输入这行命令行后会出现如下图的表单全部都填否,因为一般新手也用不上好吧。

npm create vue@latest

然后我们跟着命令行里面的提示操作一步步来,在命令行里面先后输入 cd 你刚刚填表单项目的名字 然后 npm install 然后 npm run dev,最后访问网址即可完成Hello Vue3。

可以找到创建项目里面的App.vue文件,去修改里面的HelloWorld的msg改为你的话语。 

工程目录规范

以下是我个人开发课程设计时,Vue的目录规范命名。

往往一个好的规范命名与规范位置习惯,会省去开发中大部分的麻烦。

  • assets:用于放置静态资源,比如:图片,视频,logo等。
  • api:用于放置请求后端资源的ajax或axios接口函数。
  • router:用于放置Vue的路由配置。
  • components:用于放置自己写的Vue组件。
  • views:用于放置自己写的Vue页面。 

“学Vue3我更喜欢跟着做一些东西,而不是纯纯学语法。”


正如上面所说的那样,学东西主要是为了用起来,边学边用是最好的,很多时候,你可能都不用学那么懂,就能写出能用的代码。接下来我会带着大家做几个简单的页面,主要是入门,入门的话我们只需要关注红色画框的一部分文件夹就好了,其余文件夹都不用管。

饿了么组件element plus

element plus是一个前端的组件库,就很多东西别人都写好了,你直接拿过来用就好了。想在自己的Vue项目里面使用这个组件库也很简单,首先命令行npm install element-plus --save,下载element-plus。

npm install element-plus --save

 然后在main.js里面导入我们下载好的element plus组件库就好了。

import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'const app = createApp(App)
app.use(ElementPlus)
app.mount('#app')

一个 Vue 3 UI 框架 | Element Plus (element-plus.org)icon-default.png?t=N7T8https://element-plus.org/zh-CN/

登录界面

我们在views目录下新建一个Vue文件叫做login.vue,然后里面的内容如下。

<script setup>
import {ref} from 'vue'
const id = ref("")
const ps = ref("")
// id 与 ps为响应式变量
// 为什么是const
// id可以看作是一个C的指针
// id.value才是里面放的数据
</script><template><el-form><el-form-item label="用户名"><el-input v-model="id"></el-input><!-- 把id绑定到这个输入框内 --></el-form-item><el-form-item label="密码"><el-input v-model="ps"></el-input><!-- 把ps绑定到这个输入框内 --></el-form-item></el-form><div class="my">{{ id }}</div><div class="my">{{ ps }}</div>
</template><style>.my{background-color: wheat;}
</style>

然后把App.vue的内容改成下面这个样子。

<script setup>
import LoginVue from '@/views/login.vue'
</script><template><LoginVue/>
</template>

运行后的效果如下:

数据模型/双向绑定

然后你会发现你在输入框输入的内容会在div里面动态展示出来,这就是响应式变量的作用,也就是Vue所谓的数据模型的双向绑定,意思是有一个响应式变量叫做id,它绑定了第一个输入框,然后这个输入框输入数据的同时,也会改变id.value的值。

Vue文件的结构

看完直观的前端,再说说Vue文件的结构吧,很好理解,一个Vue文件由三大结构组成script,template,style。你完全可以理解为是JS,HTML,CSS。


接着我们给我们的login.vue把按钮搞上去,尝试给按钮绑定一个点击事件好吧,然而按钮的template部分我们也不用自己写,直接去element plus的官网去复制粘贴。

 <el-button type="primary">Primary</el-button>

更改后的login.vue如下:

<script setup>
import {ref} from 'vue'const id = ref("")
const ps = ref("")
// id 与 ps为响应式变量const loginF = ()=>{alert("用户尝试登录")
}</script><template><el-form><el-form-item label="用户名"><el-input v-model="id"></el-input><!-- 把id绑定到这个输入框内 --></el-form-item><el-form-item label="密码"><el-input v-model="ps"></el-input><!-- 把ps绑定到这个输入框内 --></el-form-item></el-form><el-button type="primary" @click="loginF">Primary</el-button><!-- 把loginF函数绑定在这个按钮上 通过@click --><div class="my">{{ id }}</div><div class="my">{{ ps }}</div>
</template><style>.my{background-color: wheat;}
</style>

按钮的点击事件绑定

通过代码,我们不难发现,我们可以通过@click="函数名"进行按钮的事件绑定, 也就是说想点击按钮之后执行哪个函数,我们就只需要把函数名放在@click的里面就好了,是不是很简单。其实到这里,基本的登录已经问题不大了,剩下的无非是axios或ajax的事情了。


既然登录表单都有了,那么注册表单肯定也不能落下对吧。所有又对login.vue进行一个改进。

<script setup>
import {ref, reactive} from 'vue';const id = ref("")
const ps = ref("")
// id 与 ps为响应式变量const ShowEnrollForm = ref(false)
//是否展示注册表单?const enrollForm = reactive({id:null,ps:null,surePs:null
})
// reactive与ref都可以创造响应式变量
// 不同的是reactive多用于创造 对象式响应式变量 如表单
// ref多用于创造 一般变量 如 ShowEnrollForm
// 且ref创造的响应式变量 需要.value来访问里面的值 
//但是用reactive创造的不用 只需要 enrollForm.idconst loginF = ()=>{alert("用户尝试登录")alert(id.value)
}const enrollF = ()=>{alert("用户尝试注册")alert(enrollForm.id)
}</script><template><el-form v-model="enrollForm" v-if="ShowEnrollForm"><el-form-item label="注册用户名"><el-input v-model="enrollForm.id"></el-input><!-- 把enrollForm.id绑定到这个输入框内 --></el-form-item><el-form-item label="密码"><el-input v-model="enrollForm.ps"></el-input><!-- 把enrollForm.ps绑定到这个输入框内 --></el-form-item><el-form-item label="确认密码"><el-input v-model="enrollForm.surePs"></el-input><!-- 把enrollForm.surePs绑定到这个输入框内 --></el-form-item><el-form-item><el-button type="primary" @click="ShowEnrollForm=false">返回</el-button><el-button type="primary" @click="enrollF">注册</el-button></el-form-item></el-form><el-form v-else><el-form-item label="登录用户名"><el-input v-model="id"></el-input><!-- 把id绑定到这个输入框内 --></el-form-item><el-form-item label="密码"><el-input v-model="ps"></el-input><!-- 把ps绑定到这个输入框内 --></el-form-item><el-form-item><el-button type="primary" @click="loginF">登录</el-button><el-button type="primary" @click="ShowEnrollForm=true">注册</el-button></el-form-item></el-form>
</template>

v-if有啥用?

v-if="表达式",如果表达式为真,那么就渲染这个组件,如果表达式为假,就不渲染这个组件。在这个示例里面,我们通过ShowEnrollForm这个响应式变量的真值来控制展示登录表单还是注册表单,并通过按钮的点击可以改变ShowEnrollForm的变量值。

reactive与ref都可以创造响应式变量
不同的是reactive多用于创造对象式响应式变量,如表单。ref多用于创造一般变量,如 ShowEnrollForm。且ref创造的响应式变量需要.value来访问里面的值 ,但是用reactive创造的不用 ,只需要 enrollForm.id。


用户界面

我们在views目录下新建一个Vue文件叫做index.vue,然后里面的内容如下。

<script setup>const tableData = [{date: '2016-05-03',name: '小猫',address: '听安',},{date: '2016-05-02',name: '老弟',address: '晚安',},{date: '2016-05-04',name: '肘击',address: '云隐',},{date: '2016-05-01',name: '虚化狗',address: '木叶',},
]</script><template><el-table :data="tableData" style="width: 100%"><el-table-column prop="date" label="Date" width="180" /><el-table-column prop="name" label="Name" width="180" /><el-table-column prop="address" label="Address" /></el-table>
</template>

然后把App.vue文件进行一定的修改。

<script setup>
import LoginVue from '@/views/login.vue'
import IndexVue from './views/index.vue';
</script><template><!-- <LoginVue/> 相当于不展示登录页面了--><IndexVue/>
</template>

:data是啥?

: data也是一种数据绑定,与v-model性质是一样的,就是说把tableData这个对象绑定到了表格的data属性上去了,然后prop="键",就是说这一列要展示tableData对象的哪个键。

发现大问题

我们虽然成功展示了用户界面,但是登录界面却看不到了,这不妥妥就是捡了芝麻,丢了西瓜嘛,好比霸体后按通灵,用户界面把登录界面顶了。 这个时候我们就要用到路由了。于是我们又得先下载一个模块,npm i vue-router@4。

npm i vue-router@4

我们在router目录下新建一个JS文件叫做index.js,然后里面的内容如下。

import { createRouter, createWebHistory } from "vue-router";import LoginVue from '@/views/login.vue'
import IndexVue from '@/views/index.vue';//定义路由关系
const routes = [{ path: '/', component: LoginVue },{ path: '/index', component: IndexVue }
// 意思是在/这个路由下我要展示LoginVue这个Vue
// 在/index这个路由下我要展示IndexVue这个Vue
]//创建路由器
const router = createRouter({history: createWebHistory(),routes: routes
})export default router;

然后修改main.js和App.vue的内容。


import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import router from '@/router'const app = createApp(App)
app.use(ElementPlus)
app.use(router)
app.mount('#app')
<script setup></script><template><router-view></router-view>
</template>

“好像没啥问题了?感觉已经能用Vue进行简单的页面开发了。” 


那么用户界面怎么知道登录界面是哪个用户登录的呢?

因为login.vue与index.vue是两个vue文件,它们创建的响应式变量都只能在自己的Vue文件中使用并不可以跨Vue使用,所以index.vue是不能获取到login.vue的id.value的。

这个时候就需要下载一个模块pinia,用于存储我们想要跨Vue使用的数据。

 npm i pinia

 pinia-persistedstate-plugin是让pinia存储的数据持久化,不至于说是刷新一下页面,存储的数据就清空了,这一点的话,读者可以自证试一试。

npm i pinia-persistedstate-plugin

首先我们要导入刚刚下载的模块,修改main.js文件。


import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import router from '@/router'
import { createPinia } from 'pinia'
import { createPersistedState } from 'pinia-persistedstate-plugin'const app = createApp(App)
const pinia = createPinia()
const persist = createPersistedState()
pinia.use(persist)
app.use(pinia)
app.use(ElementPlus)
app.use(router)
app.mount('#app')

 然后,我们在api目录下新建一个JS文件叫做save.js,然后里面的内容如下。

import { defineStore } from 'pinia';
import { ref } from 'vue';export const idC = defineStore('idC', () => {const innerId = ref("");const setId = (newId) => {innerId.value = newId;}const delId = () => {innerId.value = "";}return {innerId, setId, delId}
},{persist: true// 是否持久化 });

最后,就是更新login与index的代码。

<script setup>
import { idC } from '@/api/save';
const Id = idC()
// 获取Id容器const tableData = [{date: '2016-05-03',name: '小猫',address: '听安',},{date: '2016-05-02',name: '老弟',address: '晚安',},{date: '2016-05-04',name: '肘击',address: '云隐',},{date: '2016-05-01',name: '虚化狗',address: '木叶',},
]</script><template><div>登录页面的Id是{{ Id.innerId }}</div><el-table :data="tableData" style="width: 100%"><el-table-column prop="date" label="Date" width="180" /><el-table-column prop="name" label="Name" width="180" /><el-table-column prop="address" label="Address" /></el-table>
</template>
<script setup>
import {ref, reactive} from 'vue';
import { idC } from '@/api/save';
//引入存储id的容器
const Id = idC()import {useRouter} from 'vue-router';
//引入路由 实现页面跳转
const router = useRouter()const id = ref("")
const ps = ref("")
// id 与 ps为响应式变量const ShowEnrollForm = ref(false)
//是否展示注册表单?const enrollForm = reactive({id:null,ps:null,surePs:null
})const loginF = ()=>{alert("用户尝试登录")alert(id.value)Id.setId(id.value)//把登录界面的id.value放到Id容器中router.push("/index")//实现页面跳转到路由/index
}const enrollF = ()=>{alert("用户尝试注册")alert(enrollForm.id)
}</script><template><el-form v-model="enrollForm" v-if="ShowEnrollForm"><el-form-item label="注册用户名"><el-input v-model="enrollForm.id"></el-input><!-- 把enrollForm.id绑定到这个输入框内 --></el-form-item><el-form-item label="密码"><el-input v-model="enrollForm.ps"></el-input><!-- 把enrollForm.ps绑定到这个输入框内 --></el-form-item><el-form-item label="确认密码"><el-input v-model="enrollForm.surePs"></el-input><!-- 把enrollForm.surePs绑定到这个输入框内 --></el-form-item><el-form-item><el-button type="primary" @click="ShowEnrollForm=false">返回</el-button><el-button type="primary" @click="enrollF">注册</el-button></el-form-item></el-form><el-form v-else><el-form-item label="登录用户名"><el-input v-model="id"></el-input><!-- 把id绑定到这个输入框内 --></el-form-item><el-form-item label="密码"><el-input v-model="ps"></el-input><!-- 把ps绑定到这个输入框内 --></el-form-item><el-form-item><el-button type="primary" @click="loginF">登录</el-button><el-button type="primary" @click="ShowEnrollForm=true">注册</el-button></el-form-item></el-form></template><style>.my{background-color: wheat;}
</style>

 

Vue开发心得

学完Vue3,也是完成了JAVA课程设计的Vue项目好吧。说说开发心得吧。其实开发Vue无非就是先想好自己页面上需要有什么东西,比如:登录界面需要一个表单,用户界面需要表格。然后我们就去element plus找对应的代码,改一改就能用了。最后完善JS那部分的逻辑,和绑定按钮事件,其实就没什么了。

 

 

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

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

相关文章

【MARIE】嵌入式系统设计半期报告:MARIE模拟器的使用

1.模拟器介绍 1.1 体系结构 MARIE &#xff08;Machine Architecture that is Really Intuitive and Easy&#xff09; 是一种机器架构和汇编语言。发布者还为机器提供了一组用 Java 编写的模拟器程序。MARIE.js 是 MARIE 的 JavaScript 版本实现。它旨在尽可能忠实于原始 Ja…

基于EKF扩展卡尔曼滤波的一阶环形倒立摆控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于EKF扩展卡尔曼滤波的一阶环形倒立摆控制系统simulink建模与仿真。基于扩展卡尔曼滤波&#xff08;Extended Kalman Filter, EKF&#xff09;的一阶环形倒立摆控制系统&…

【并发程序设计】4. exec函数族

4.exec函数族 exec函数族是一组用于在进程中启动另一个程序来替换当前进程的函数。 exec函数族主要用于在当前进程内部执行一个新的程序&#xff0c;而不会创建新的进程。 子进程调用exec函数&#xff0c;族父进程不受影响。进程当前内容被指定的程序替换&#xff0c;但进程…

【YOLOV5 入门】——Gradio搭建Web GUI

引入&#xff1a;上节搭建的UI可视化界面只能以运行程序弹出窗口的形式运行&#xff0c;不能在网页Web中使用&#xff0c;本次代码将会非常少&#xff01; 一、Gradio简介与安装 Gradio 是一个用于构建机器学习模型演示界面和Web应用的开源库。提供了简单易用的界面&#xff0…

云端的艺术革命:云渲染如何重塑动画与视觉特效产业

在 2019 年&#xff0c;乔恩费儒&#xff08;Jon Favreau&#xff09;决定重拍迪士尼的经典电影《狮子王》。他的创新构想是以真实动物为模型&#xff0c;在非洲草原上拍摄&#xff0c;由真实动物“出演”的辛巴和其他角色&#xff0c;随后通过配音赋予它们生命。 为了实现这一…

janus源码分析(1)--代码结构整理

基础说明 janus官网 https://janus.conf.meetecho.com/index.html janus源码地址 https://github.com/meetecho/janus-gateway 编译及部署参考 https://pro-hnb.blog.csdn.net/article/details/137730389?spm1001.2014.3001.5502 https://pro-hnb.blog.csdn.net/article/deta…

【Python探索之旅】列表

目录 特点 入门 访问元素 新增元素 修改元素 插入元素 删除元素 完结撒花 前言 在Python中&#xff0c;列表(List)是最常用的数据结构之一&#xff0c;类似于其他语言&#xff0c;如Java&#xff0c;与其不同啊Python中不需要声明数据类型。它提供了一种灵活且高效的方式…

Linux-线程

目录 1. 线程概念 2. 线程vs进程 3. 线程的优缺点 4. 线程创建 4.1 pthread_create 4.2 pthread_self 5. 线程终止 5.1 return 5.2 pthread_exit 5.3 pthread_cancel 6. 线程等待 7. 线程分离 1. 线程概念 线程&#xff1a;轻量级进程&#xff0c;在进程内部执行&a…

谷歌Gemini时代来了!加固搜索护城河、赋能全家桶,Gemini 1.5 Pro升级至200万token

3 月中旬&#xff0c;谷歌宣布 Google I/O 定档北京时间 5 月 15 日凌晨 1 点。而当大会开幕时间临近&#xff0c;本应是讨论度最高的时候&#xff0c;「宿敌」OpenAI 却半路杀出&#xff0c;抢先一天&#xff0c;仅耗时 27 分钟就发布了颠覆性巨作 GPT-4o&#xff0c;将新一轮…

PyTorch中定义自己的数据集

文章目录 1. 简介2. 查看PyTorch自带的数据集(可视化)3. 准备材料3.1 图片数据3.2 标签数据 4. 方法 1. 简介 尽管PyTorch提供了许多自带的数据集&#xff0c;如MNIST、CIFAR-10、ImageNet等&#xff0c;但它们对于没有经验的用户来说&#xff0c;理解数据加载器的工作原理以及…

【启程Golang之旅】环境设置、工具安装与代码实践

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…

【Web后端】MVC模式

1、简介 MVC模式&#xff0c;全称Model-View-Controller&#xff08;模型-视图-控制器&#xff09;模式&#xff0c;是一种软件设计典范&#xff0c;它将应用程序的用户界面&#xff08;视图&#xff09;和业务逻辑&#xff08;模型&#xff09;分离&#xff0c;同时提供了一个…

K8S内容

K8S介绍 1、故障迁移:当某一个node节点关机或挂掉后&#xff0c;node节点上的服务会自动转移到另一个node节点上&#xff0c;这个过程所有服务不中断。这是docker或普通云主机是不能做到的 2、资源调度:当node节点上的cpu、内存不够用的时候&#xff0c;可以扩充node节点&…

​​​【收录 Hello 算法】6.2 哈希冲突

目录 6.2 哈希冲突 6.2.1 链式地址 6.2.2 开放寻址 1. 线性探测 2. 平方探测 3. 多次哈希 6.2.3 编程语言的选择 6.2 哈希冲突 上一节提到&#xff0c;通常情况下哈希函数的输入空间远大于输出空间&#xff0c;因此理论上哈希冲突是不可避免的。比如&a…

LeetCode题练习与总结:不同的二叉搜索树--96

一、题目描述 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#xff1a;n 1 输出&…

从需求角度介绍PasteSpider(K8S平替部署工具)

你是否被K8S的强大而吸引&#xff0c;我相信一部分人是被那复杂的配置和各种专业知识而劝退&#xff0c;应该还有一部分人是因为K8S太吃资源而放手&#xff01; PasteSpider是一款使用c#编写的linux容器部署工具&#xff0c;简单易上手&#xff0c;非常节省资源&#xff0c;支持…

shell脚本实现linux系统自动化配置免密互信

目录 背景脚本功能脚本内容及使用方法 1.背景 进行linux自动化运维时需要先配置免密&#xff0c;但某些特定场景下&#xff0c;做了互信的节点需要取消免密&#xff0c;若集群庞大节点数量多时&#xff0c;节点两两之间做互信操作非常麻烦&#xff0c;比如有五个节点&#x…

C++——动态规划

公共子序列问题 ~待补充 最长公共子序列 对于两个字符串A和B&#xff0c;A的前i位和B的前j位的最大公共子序列必然是所求解的一部分&#xff0c;设dp[i][j]为串A前i位和B串前j位的最长公共子序列的长度&#xff0c;则所求答案为dp[n][m]&#xff0c;其中n&#xff0c;m分别为…

微信小程序主体变更的操作教程

小程序迁移变更主体有什么作用&#xff1f;进行小程序主体迁移变更&#xff0c;那可是益处多多呀&#xff01;比方说&#xff0c;能够解锁更多权限功能&#xff1b;在公司变更或注销时&#xff0c;还能保障账号的正常使用&#xff1b;此外&#xff0c;收购账号后&#xff0c;也…

详解xlsxwriter 操作Excel的常用API

我们知道可以通过pandas 对excel 中的数据进行处理分析&#xff0c;但是pandas本身对格式化数据方面提供了很少的支持&#xff0c;如果我们想对pandas进行数据分析后的数据进行格式化相关操作&#xff0c;我们可以使用xlsxwriter&#xff0c;本文就对xlsxwriter的常见excel格式…