笔记:SpringBoot+Vue全栈开发2

笔记:SpringBoot+Vue全栈开发2

    • 1. MVVM模式
    • 2. Vue组件化开发
    • 3. 第三方组件element-ui的使用
    • 4. axios网络请求
    • 5. 前端路由VueRouter

1. MVVM模式

MVVM是Model-View-ViewModel的缩写,是一种基于前端开发的架构模式,其核心是提供对View和ViewModel的双向数据绑定。
ViewModel负责连接View和Model,保证视图和数据的一致性。
使用的vue版本为vue3,直接导入vue3本地文件路径在html文件中,然后在写入如下代码:

Vue.createApp({
     data(){
         return {
         }
     },
     methods: {
         
     }
 }).mount("#app");
 // 挂载

data下用于写数据变量,methods下写方法,然后把整个vue容器挂载到id值为app的标签上。
渲染数据使用双花括号,即“{{}}”,花括号中可以写变量或者表达式;如果要渲染html标签字符串,使用v-html;设置标签属性值时使用v-bind:属性名,可以简写为“:属性名”;设置标签元素上的事件时使用v-on:时间名,可以简写为“@事件名”;进行条件判断可以考虑使用v-if或v-show,其中使用v-if为false时,在页面上是没有这个标签元素,而v-show为false时,只是设置了这个标签元素的css样式值"display:none",通常频繁变换切换的考虑使用v-show;进行列表渲染时,使用v-if,即v-for=“user in users"或者v-for=”(user,index) in users",后者带有index下表索引,从0开始,通常需要添加key属性,否则存在潜在的bug,下述演示代码中没有使用key属性;v-model是对表单标签元素进行双向数据绑定。

参考代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>vue3</title>
    <script type="text/javascript" src="../vue3.js"></script>
</head>
<body>
    <div id="app">
        <div>{{text_str}}</div>
        <div>{{html_str}}</div>
        <div v-html="html_str"></div>
        <a v-bind:href="href_str">{{href_text}}</a>
    <!-- {{表达式或者变量}}} -->
        <p>{{v}}</p>
        <button v-on:click="hh_fuc">+1</button>
        <br>
        <!-- 条件判断 -->
        <button @click="flag = !flag">变换</button>
        <p v-if="flag">v-if:哈哈2</p>
        <p v-show="flag">v-show:哈哈2</p>

        <!-- 列表渲染 -->
        <ul>
            <!-- <li v-for="user in users">
                <span>{{user.username}}</span>
                <span>{{user.age}}</span>
            </li> -->

            <li v-for="(user,i) in users">
                <span>{{i}}</span>
                <span>{{user.username}}</span>
                <span>{{user.age}}</span>
            </li>
        </ul>
    </div>
</body>
<script type="text/javascript">
    Vue.createApp({
        data(){
            return {
                text_str:"hello world!",
                html_str:"<h3>哈哈</h3>",
                href_str:"https://www.baidu.com",
                href_text:"百度",
                v:1,
                flag:false,
                users:[
                    {
                        username:"张三",
                        age:23
                    },
                    {
                        username: "李四",
                        age: 29
                    },
                    {
                        username: "王五",
                        age: 32
                    }
                ]
            }
        },
        methods: {
            hh_fuc: function () {
                this.v++;
            }
        }
    }).mount("#app");
    // 挂载
</script>
</html>

在这里插入图片描述

2. Vue组件化开发

需要用到npm命令,当然首先需要安装nodejs。
使用Vue CLI 脚手架进行构建项目,创建项目命令为:

npm install -g @vue/cli
// 安装vue cli脚手架命令
vue create 项目名
// 创建项目命令

请添加图片描述

运行首先来到当前项目目录下,然后使用命令npm run serve
在这里插入图片描述

在这里插入图片描述
vue中规定组件的后缀名为“.vue”,每个“.vue”组件都由3个部分构成,分别为template、script、style。
自定义组件,首先在当前项目的components目录下新建vue文件,文件命名通常首字母大写,然后在这个文件下添加组件的三部分,之后在App.vue这个文件中导入刚才新建的组件,“import 组件 from ‘./components/组件.vue’”,然后在进行注册一下,即可在页面上添加刚才新建的组件了。
在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述

3. 第三方组件element-ui的使用

由第三方组件element-ui目前仅支持vue2,vue3仍在开发当中,为此,下述项目为vue2。element-ui官网链接为:element-ui
在这里插入图片描述
需要注意的是vue2中template下只能有一个直接子标签,而vue3没有限制。下载element-ui命令为:

npm install element-ui

直接在当前项目的文件下运行上述命令即可,然后在mian.js文件中导入element-ui组件,并对这个组件进行全局注册。

import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';

Vue.use(ElementUI);

之后在一些组件下copy element-ui的组件的源码并进行修改就可以用在自己的项目上了,如下:

<template>
  <el-table
    :data="tableData"
    style="width: 100%"
    :row-class-name="tableRowClassName">
    <el-table-column
      prop="date"
      label="日期"
      width="180">
    </el-table-column>
    <el-table-column
      prop="name"
      label="姓名"
      width="180">
    </el-table-column>
    <el-table-column
      prop="address"
      label="地址">
    </el-table-column>
  </el-table>
</template>

<style>
  .el-table .warning-row {
    background: oldlace;
  }

  .el-table .success-row {
    background: #f0f9eb;
  }
</style>

<script>
  export default {
    methods: {
      tableRowClassName({row, rowIndex}) {
        if (rowIndex === 1) {
          return 'warning-row';
        } else if (rowIndex === 3) {
          return 'success-row';
        }
        return '';
      }
    },
    data() {
      return {
        tableData: [{
          date: '2016-05-02',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄',
        }, {
          date: '2016-05-04',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-01',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄',
        }, {
          date: '2016-05-03',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }]
      }
    }
  }
</script>

运行结果:
在这里插入图片描述

4. axios网络请求

安装axios,命令为:

npm install axios

在项目中导入

import axios from 'axios'

发起网络请求通常需要涉及到生命周期,在created里边。
这里有一条api接口,如下:
在这里插入图片描述
这个接口的端口号为9998,而我的vue项目的端口号为8080,此时会出现跨域问题,跨域也就是请求协议、ip地址及端口号三者不同导致的。
在这里插入图片描述
在这里插入图片描述
报错信息为:“localhost/:1 Access to XMLHttpRequest at ‘http://localhost:9998/users’ from origin ‘http://localhost:8080’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.”
解决跨域的问题,通常可以从前端和后端两个进行解决,下面采用的是在后端代码添加配置类来解决跨域问题。

package com.liuze.demo.config;


import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CrosConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {

        registry.addMapping("/**") // 允许跨域访问的路径
        .allowedOrigins("*") // 允许跨域访问的源
        .allowedMethods("POST","GET","PUT") // 允许的请求方式
        .maxAge(168000) // 预检间隔时间
        .allowedHeaders("*") // 允许头部设置
        .allowCredentials(false); // 是否发送cookie
    }
}

在这里插入图片描述
另外,也可以在这个控制器类上添加注解“@CrossOrigin”,这样对于整个控制器类下面的接口都是可以生效的。
在这里插入图片描述
在页面上进行显示

created:function(){   axios.get("http://localhost:9998/users").then((res)=>{
    this.tableData = res.data;
  })
}

在这里插入图片描述

5. 前端路由VueRouter

通过不同路由,把路径和组件一一映射。
vue-router目前有两个版本,分别为vue-router3.x,vue-router4.x,前者只能和vue2进行结合使用,后者只能和vue3进行结合使用。安装vue-router的命令如下:

npm install vue-router@4

在项目的components组件目录下新建几个组件“.vue”文件,组件文件中写上最简单的结构容易辨别即可。然后在项目的目录下新建router文件夹,在这个目录下新建“index.js”,在这个文件中写路径与组件的映射关系。

import VueRouter from 'vue-router';
import Vue from 'vue';
import Find from '../components/Find.vue'
import Friend from '../components/Friend.vue'
import Music from '../components/Music.vue'

Vue.use(VueRouter)
const router = new VueRouter({
    routes: [
        {path:"/",redirect:'/find'}, // 重定向
        { path: '/find', component: Find },
        { path: '/friend', component: Friend },
        { path: '/music', component: Music }
    ]
});
// 导出
export default router

然后在“main.js”文件中把这个router路由导入到vue容器中

import Vue from 'vue'
import App from './App.vue'
import router from './router/index.js'

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
  router: router
}).$mount('#app')

在“App.vue”主组件上添加“router-link,router-view”标签元素

<template>
  <div id="app">
    <router-link to="/find">发现</router-link>
    <router-link to="/friend">朋友</router-link>
    <router-link to="/music">音乐</router-link>

    <router-view></router-view>
  </div>
</template>

运行结果如下:
请添加图片描述
动态路由,也就是根据路径中的一些参数不同,从而跳到不同的页面。如在上述“index.js”中给Music添加子组件,如下,

{ path: '/music', component: Music 
 ,children:[
     {path:':id',component:MusicItem2}]
 }

对应的Music组件为:

<template>
    <div>
        音乐
        <router-link to="/music/1">音乐1</router-link>
        <router-link to="/music/2">音乐2</router-link>
        <router-view></router-view>
    </div>
</template>

组件MusicItem2为:

<template>
    <div>
        音乐{{$route.params.id}}
    </div>
</template>

运行结果:
请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【简单介绍下Memcached】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

独立开发者系列(21)——HTTP协议的使用

作为网络访问的必备知识点&#xff0c;http协议&#xff0c;我们已经知道http协议属于tcp的一种&#xff0c;而且一般是用于网络通讯的&#xff0c;但是本身http协议本身包含的内容也很多&#xff0c;正是因为有这种协议&#xff0c;前后端和各种硬件接口/服务器接口/前端&…

VSCode远程服务器如何上传下载文件(超方便!)

方法一&#xff1a; 1、在VSCode应用商店安装SFTP插件 2、然后就可以直接把文件拖进VSCode即可&#xff0c;如下图所示&#xff1a; 这里的目录是我远程服务器上的目录&#xff0c;可以直接将要上传的文件直接拖进需要的文件夹 3、如果要从远程服务器上下载文件到本地&#x…

手写实现一个ORM框架

手写实现一个ORM框架 什么是ORM框架、ORM框架的作用效果演示框架设计代码细节SqlBuilderSqlExecutorStatementHandlerParameterHandlerResultSetHandler逆序生成实体类 大家好&#xff0c;本人最近写了一个ORM框架&#xff0c;想在这里分享给大家&#xff0c;让大家来学习学习。…

axios的使用,处理请求和响应,axios拦截器

1、axios官网 https://www.axios-http.cn/docs/interceptors 2、安装 npm install axios 3、在onMouunted钩子函数中使用axios来发送请求&#xff0c;接受响应 4.出现的问题&#xff1a; &#xff08;1&#xff09; 但是如果发送请求请求时间过长&#xff0c;回出现请求待处…

分布式共识算法

分布式的基石 分布式共识算法 前置知识&#xff1a;分布式的 CAP 问题&#xff0c;在事务一章中已有详细介绍。 正式开始探讨分布式环境中面临的各种技术问题和解决方案以前&#xff0c;我们先把目光从工业界转到学术界&#xff0c;学习两三种具有代表性的分布式共识算法&…

昇思MindSpore学习总结十——ResNet50迁移学习

1、迁移学习 &#xff08;抄自CS231n Convolutional Neural Networks for Visual Recognition&#xff09; 在实践中&#xff0c;很少有人从头开始训练整个卷积网络&#xff08;使用随机初始化&#xff09;&#xff0c;因为拥有足够大小的数据集相对罕见。相反&#xff0c;通常…

Flask之电子邮件

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、使用Flask-Mail发送电子邮件 1.1、配置Flask-Mail 1.2、构建邮件数据 1.3、发送邮件 二、使用事务邮件服务SendGrid 2.1、注册SendGr…

昇思25天学习打卡营第11天|MindSpore 助力下的 GPT2:数据集加载处理及模型全攻略

目录 环境配置 数据集下载和获取 数据集拆分 处理数据集 模型构建 ​​​​​​​模型训练 ​​​​​​​模型推理 环境配置 “%%capture captured_output”这一行指令通常旨在捕获后续整个代码块所产生的输出结果。首先&#xff0c;将已预装的 mindspore 库予以卸载。随后&a…

68.WEB渗透测试-信息收集- WAF、框架组件识别(8)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;67.WEB渗透测试-信息收集- WAF、框架组件识别&#xff08;7&#xff09; 右边这些是waf的…

【Java学习笔记】方法的使用

【Java学习笔记】方法的使用 一、一个例子二、方法的概念及使用&#xff08;一&#xff09;什么是方法&#xff08;二&#xff09;方法的定义&#xff08;三&#xff09;方法调用的执行过程&#xff08;四&#xff09;实参和形参的关系&#xff08;重要&#xff09;&#xff08…

第1节、基于太阳能的环境监测系统——MPPT充电板

一、更新时间&#xff1a; 本篇文章更新于&#xff1a;2024年7月6日23:33:30 二、内容简介&#xff1a; 整体系统使用太阳能板为锂电池充电和系统供电&#xff0c;天黑后锂电池为系统供电&#xff0c;本节主要介绍基于CN3722的MPPT太阳能充电模块&#xff0c;这块主要是硬件…

如何从相机的存储卡中恢复原始照片

“不好了。” 当您意识到自己不小心从存储卡中删除了照片&#xff0c;或者错误地格式化了相机的记忆棒时&#xff0c;您首先会喊出这两个词。这是一种常见的情况&#xff0c;每个人一生中都会遇到这种情况。幸运的是&#xff0c;有办法从相机的 RAW 记忆棒中恢复已删除的照片。…

关于小爱同学自定义指令执行

1.前言 之前买了小爱同学音响&#xff0c;一直想让其让我的生活变得更智能&#xff0c;编写一些程序来完成一些自动化任务&#xff0c;但是经过搜索发现&#xff0c;官方开发者平台不能用了&#xff0c;寻找api阶段浪费了我很长时间。最后在github 开源项目发现了俩个比较关键…

gcc的编译C语言的过程

gcc的简介 GCC&#xff08;GNU Compiler Collection&#xff09;是由GNU项目开发和维护的一套开源编程语言编译器集合。它支持多种编程语言&#xff0c;包括但不限于C、C、Objective-C、Fortran、Ada等。GCC被广泛应用于编译和优化各种程序&#xff0c;是许多开发者和组织的首选…

防火墙基础及登录(华为)

目录 防火墙概述防火墙发展进程包过滤防火墙代理防火墙状态检测防火墙UTM下一代防火墙&#xff08;NGFW&#xff09; 防火墙分类按物理特性划分软件防火墙硬件防火墙 按性能划分百兆级别和千兆级别 按防火墙结构划分单一主机防火墙路由集成式防火墙分布式防火墙 华为防火墙利用…

ubuntu22.04+pytorch2.3安装PyG图神经网络库

ubuntu下安装torch-geometric库&#xff0c;图神经网络 开发环境 ubuntu22.04 conda 24.5.0 python 3.9 pytorch 2.0.1 cuda 11.8 pyg的安装网上教程流传着许多安装方式&#xff0c;这些安装方式主要是&#xff1a;预先安装好pyg的依赖库&#xff0c;这些依赖库需要对应上pyth…

C++11|包装器

目录 引入 一、function包装器 1.1包装器使用 1.2包装器解决类型复杂 二、bind包装器 引入 在我们学过的回调中&#xff0c;函数指针&#xff0c;仿函数&#xff0c;lambda都可以完成&#xff0c;但他们都有一个缺点&#xff0c;就是类型的推导复杂性&#xff0c;从而会…

详解Amivest 流动性比率

详解Amivest 流动性比率 Claude-3.5-Sonnet Poe Amivest流动性比率是一个衡量证券市场流动性的重要指标。这个比率主要用于评估在不对价格造成重大影响的情况下,市场能够吸收多少交易量。以下是对Amivest流动性比率的详细解释: 定义: Amivest流动性比率是交易额与绝对收益率的…

一.2.(1)双极型晶体三极管的结构、工作原理、特性曲线及主要参数

1.双极型晶体三极管的结构 学会区分P管和N管&#xff0c;会绘制符号 2.工作原理 无论是PNP 还是NPN&#xff0c;本质上放大时&#xff0c;都是发射结正偏&#xff0c;集电极反偏。&#xff08;可以简单理解为pn为二极管&#xff0c;每个三极管都有两个二极管&#xff09; 其中电…