Vue3与Vue2的主要区别

news2024/12/22 19:21:33

本篇文章适用于熟练掌握Vue2的小伙伴们,不想重新学习Vue3,那看本篇文章就够啦!希望大家收获多多!!


Vue3是向下兼容的,可以运行Vue2代码

一、页面区别

Vue2定义属性方法

<template>
  <div >
    <div>简单属性</div>
    <div>{{ msg }}</div>
    <div><button @click="updateMsg">修改简单属性</button></div>

    <div>对象属性</div>
    <div>{{ ObjMsg.msg }}</div>
    <div><button @click="updateObjMsg">修改对象属性</button></div>
  </div>
</template>
<script>
export default {
  name: "namePage",
  data() {
    return {
      msg: "简单属性",
      ObjMsg: {
        msg: "对象属性",
      },

    };
  },
  methods: {
    updateMsg() {
      this.msg = "修改简单属性";
    },
    updateObjMsg() {
      this.ObjMsg.msg = "修改对象属性";
    },
  },

};
</script>
<style lang="scss" scoped></style>

Vue3组合式API定义属性方法

不用定义method、data 更方便

<template>
  <div >
    <div>简单属性</div>
    <div>{{ msg }}</div>
    <div><button @click="updateMsg">修改简单属性</button></div>

    <div>对象属性</div>
    <div>{{ ObjMsg.msg }}</div>
    <div><button @click="updateObjMsg">修改对象属性</button></div>
  </div>
</template>

<script setup>
//需要导入ref 和reactive
import { ref, reactive } from 'vue'

//ref定义简单属性
const msg = ref('简单属性')
const updateMsg = () => {
  //注意:没有this对象了
  msg.value = '修改了简单属性'
}


//reactive定义对象属性  
const ObjMsg = reactive({
  msg: '对象属性'
})
const updateObjMsg = () => {
  ObjMsg.msg = '修改了对象属性'
}

  //reactive也可以使用ref(最终都是转为ref的)但是需要使用.value来访问
// const ObjMsg = ref({
//   msg: '对象属性'
// })
// const updateObjMsg = () => {
//   ObjMsg.value.msg = '修改了对象属性'
// }
</script>

<style scoped>

</style>

详解<script setup>

<script setup> 是 Vue 3 中引入的一种新的脚本编写方式,它允许您以更加简洁的方式编写 Vue 组件。<script setup> 提供了一种声明式的方式来定义组件的逻辑,同时它还支持组合 API,使得代码更加简洁和易于理解。

<script setup> 的基本用法:

导入组合 API:

直接在 <script setup> 中导入 Vue 的组合 API,如 ref、reactive 等。

定义响应式状态:

使用 ref 或 reactive 定义响应式状态。

定义方法:

直接定义方法,无需像传统的 Vue 选项 API 那样将方法放在 methods 对象中。

自动暴露:

<script setup> 中定义的所有顶级变量和函数都会自动暴露给模板使用,无需显式地使用 export default。

类型声明:

可以使用 TypeScript 进行类型声明。

结果

上方两种效果相同

二、router使用的区别

vue2中使用router

定义router

import Vue from "vue";
import VueRouter from "vue-router";
import newPage from "../views/vuePage.vue";
import indexPage from "../views/indexPage.vue";

Vue.use(VueRouter);

const routes = [
    {
        path: '/',
        name: 'indexPage',
        component: indexPage
    },
    {
        path: '/newPage',
        name: 'newPage',
        component: newPage
    },
];
const router = new VueRouter({
    mode: 'history',
    base: process.env.BASE_URL,
    routes
});

export default router;

在main.js中引入router

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

 Vue.config.productionTip = false

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

在vue中使用router

//template中
<el-button class="button1" type="danger" @click="goToVue">Vue基础</el-button>
//method中
goToVue() {
        // 使用编程式导航跳转到 /newPage 页面
        this.$router.push({
          path: '/newPage'
        })
      },

Vue3使用router

定义router

// src/router/index.js
import { createRouter, createWebHistory } from 'vue-router';

// 导入组件
import HelloWorld from '../components/HelloWorld.vue';



// 定义路由
const routes = [
  { path: '/', component: HelloWorld },

];

// 创建路由器实例
const router = createRouter({
  history: createWebHistory(),
  routes,
});

// 导出路由器
export default router;

在main.js中使用

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'; // 导入路由配置
// createApp(App).mount('#app')
// 引入全局样式
const app = createApp(App);

// 使用路由
app.use(router);

// 挂载根组件
app.mount('#app');

在vue中使用router

<template>
      <button @click="toHellow">跳转</button>
</template>
  
  <script setup>
  //需要导入router
  import { useRouter ,useRoute} from 'vue-router'
  const router = useRouter();
  const route = useRoute();
  
  const toHellow = () => {
    //注意:没有this对象了
    //跳转
    console.log('当前页面路由', route.path)
    router.push('/HelloWorld')
  }
  
  
  </script>
  
  <style scoped>
  
  </style>

三、全局变量方法和变量

vue2中定义全局变量

main.js中定义

定义Utils的isEmpty方法并Vue.prototype.Utils = Utils;

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'

Vue.use(ElementUI)
// Vue.config.productionTip = false


//定义全局变量isEmpty
const Utils = {
  isEmpty:(value) =>{
    if(value === null || value === undefined || value === ''){
      return true;
    }else{
      return false;

    }
  }
}
Vue.prototype.Utils = Utils;

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

页面使用

 created() {
      let a="new"
      console.log("调用全局变量判断是否为空",this.Utils.isEmpty(a))
    },

Vue3中定义全局变量(方法)

main.js中定义

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'; // 导入路由配置
// createApp(App).mount('#app')

//定义全局变量isEmpty
const Utils = {
    isEmpty:(value) =>{
      if(value === null || value === undefined || value === ''){
        return true;
      }else{
        return false;
  
      }
    }
  }

// 引入全局样式
const app = createApp(App);


app.config.globalProperties.$utils = Utils;

// 使用路由
app.use(router);

// 挂载根组件
app.mount('#app');

页面使用

通过代理

import { useRouter, useRoute } from 'vue-router'
import { getCurrentInstance } from 'vue';
const { proxy } = getCurrentInstance();
const init = () => {
    let a="aaaaa"
    console.log('当前页面实例', proxy.Utils.isEmpty(a))
}
init()

四、watch监听属性

vue2的watch监听属性

<template>
<div>
  <div>需要监听的值:{{msg}}</div>
  <button @click="updateMsg">修改</button>
</div>
</template>

<script>
export default {
  name: "pPage",
  data() {
    return {
      msg: "123456"
    }
  },
  methods: {
    updateMsg() {
      this.msg = new Date().getTime();
    }
  },
  watch: {
    //简单形式
    // msg(newValue, oldValue) {
    //   console.log("newValue", newValue);
    //   console.log("oldValue", oldValue);
    // }
    //对象形式
    msg: {
      deep: true,
      immediate: true,//初始化是否执行
      handler(newValue, oldValue) {
        console.log("newValue", newValue);
        console.log("oldValue", oldValue);
      },
    }
  }
}
</script>

<style scoped>

</style>

Vue3的watch监听属性

<template>
    <div>需要监听的值:{{ msg }}</div>
    <button @click="toChange">改变</button>
</template>
  
<script setup>

import { ref,watch } from 'vue';
const msg = ref('1111')
const toChange = () => {
    msg.value = new Date().getTime();
}
//简单的没有其他设置的监听
// watch(msg, (newVal, oldVal) => {
//     console.log('监听msg变化', newVal, oldVal)
// })
//对象形式
watch(msg, (newVal, oldVal) => {
    console.log('监听msg变化', newVal, oldVal)
}, {
    immediate: true,
    deep: true
})
</script>
  
<style scoped></style>

区别总结

语法差异:

Vue 2 中,watch 是定义在组件的选项对象中的。

Vue 3 中,使用 Composition API 的 watch 函数。

配置选项:

Vue 2 中,你可以直接在 watch 的对象形式中指定 deep 和 immediate 选项。

Vue 3 中,这些选项同样可以通过第三个参数传递给 watch 函数。

回调函数:

Vue 2 中,简单的回调函数可以直接定义在 watch 对象中。

Vue 3 中,回调函数作为 watch 函数的第一个参数。

监听的对象:

Vue 2 中,watch 直接监听数据属性。

Vue 3 中,通常监听通过 Composition API 创建的响应式引用。

五、生命周期

vue2中的生命周期

export default {
  data() {
    return {
      message: 'Hello Vue!'
    };
  },
  created() {
    console.log('Component created.');
  },
  mounted() {
    console.log('Component mounted.');
  },
  beforeDestroy() {
    console.log('Component will be destroyed.');
  },
  destroyed() {
    console.log('Component destroyed.');
  },
  methods: {
    updateMsg() {
      this.msg = new Date().getTime();
    }
  },
};

vue3中的生命周期

import { onMounted, onBeforeUnmount, ref } from 'vue';

export default {
  setup() {
    const message = ref('Hello Vue!');

    onMounted(() => {
      console.log('Component mounted.');
    });

    onBeforeUnmount(() => {
      console.log('Component will be unmounted.');
    });

    return {
      message
    };
  }
};

主要区别

1、Composition API 的引入:

Vue 3 引入了 Composition API,其中 setup 函数取代了 beforeCreate 和 created 钩子的功能。

setup 函数在组件初始化时调用,可以接收 props 参数,并返回模板中使用的数据、计算属性、方法等。

2、生命周期钩子的名称变更:

beforeDestroy 更名为 beforeUnmount。

destroyed 更名为 unmounted。

3、生命周期钩子的移除:

Vue 3 移除了 beforeCreate 和 created 钩子,因为它们的功能被 setup 所替代。

4、生命周期钩子的新增:

Vue 3 并没有新增生命周期钩子,但通过 Composition API 提供了更多的灵活性。

Vue 2 的生命周期钩子如下所示:

创建阶段 beforeCreate created beforeMount  mounted

更新阶段 beforeUpdate updated

销毁阶段 beforeDestroy  destroyed

错误处理 errorCaptured 

异步组件 activated deactivated

服务端渲染 serverPrefetch

Vue 3 的生命周期钩子如下所示:

创建阶段  setup (Composition API)

beforeCreate 和 created 被 setup 替代

挂载阶段 beforeMount mounted

更新阶段 beforeUpdate updated

销毁阶段 beforeUnmount unmounted

错误处理 errorCaptured 

异步组件 activated deactivated

服务端渲染 serverPrefetch

六、父子组件的调用

Vue2父子组件间的调用

1、父组件给子组件传值使用props

父组件:
<div>
    <SonPage  msg="通过props传递值---父=>子" ></SonPage>
    <h1>父组件</h1>
  </div>
子组件
<div :style="{border: '1px solid red'}">
  <h1>子组件</h1>

  <div>我是父组件传入的参数:{{ msg }}</div>
</div>
<script>
export default {
  props: {
    msg: {
      type: String,
    }
  },
  name: "SonPage",
}
</script>

2、父组件调用子组件方法

父组件

使用 this.$refs.sonRef.子组件方法名。父组件在使用子组件时要加ref,上下一致

<template>
  <div>
    <SonPage ref="sonRef" ></SonPage>
    <h1>父组件</h1>
    <button @click="opSon">我要调用子组件</button>
  </div>
</template>

<script>
import SonPage from "@/views/SonPage";

export default {
  name: "pPage",
  components: {SonPage},
 
  methods: {
    opSon() {
      this.$refs.sonRef.ParentOpSon("我是父组件调用子组件方法传入的参数");
    },
  },
}
</script>
子组件
<template>
  <div :style="{border: '1px solid red'}">
    <h1>子组件</h1>
    <div>这里是父组件调用子组件方法传入的参数:{{ msg2 }}</div>
  </div>
</template>

<script>
export default {
  name: "SonPage",
  data() {
    return {
      msg2: ""
    }
  },
  methods: {
    ParentOpSon(parentMsg) {
      this.msg2 = parentMsg;
    },
  },
}
</script>

<style scoped>

</style>
结果:

3、子组件调用父组件方法

父组件

使用子组件标签上加@【子组件的this.$emit中第一个参数名】。方法使用 e就是子组件的参数

<template>
  <div>
    <SonPage @opParent="parentMethod"></SonPage>
    <h1>父组件</h1>
    <div>我是子组件调用父组件方法传入的参数{{ sonMsg }}</div>
  </div>
</template>
<script>
import SonPage from "@/views/SonPage";

export default {
  name: "pPage",
  components: {SonPage},
  data() {
    return {
      sonMsg: ""
    }
  },
  methods: {
    parentMethod(e) {
      console.log(e);
      this.sonMsg = e;
    }
  },

}
</script>

<style scoped>

</style>
子组件

子组件中使用this.$emit("父组件标签上的@的名"," 调用父组件方法的参数")

<template>
  <div :style="{border: '1px solid red'}">
    <h1>子组件</h1>
    <button @click="opParent">我要调用父组件的方法</button>
  </div>
</template>

<script>
export default {
  name: "SonPage",
  data() {
    return {
      msg2: ""
    }
  },
  methods: {
    opParent() {
      this.$emit("opParent", "我是子组件调用父组件方法传入的参数")
    }
  },
}
</script>

<style scoped>

</style>
结果:

Vue3父子组件间的调用

1、父组件给子组件传值使用

父组件

注意::msg

<template>
    <button @click="toHellow">跳转</button>
    <div>
    <SonPage :msg="myMsg"></SonPage>
    <h1>父组件</h1>
  </div>
</template>
  
<script setup>
import SonPage from './sonPage.vue'
const myMsg = '我是父组件传入的参数'
</script>
  
<style scoped></style>
子组件

注意使用 <script setup>和defineProps

<template>
    <div :style="{border: '1px solid red'}">
      <h1>子组件</h1>
      <div>这里是父组件传入的参数:{{ msg }}</div>
    </div>
  </template>
  <script setup>
  import { defineProps } from 'vue';
 defineProps({
        msg: {
        type: String,
        default: ''
      }
  })
  </script>
  <style scoped>
  </style>
  

2、父组件调用子组件方法

父组件

父组件中的子组件标签需要添加ref并定义, ref.vue.子组件名字(参数) 即可调用成功

<template>
    <div>
    <SonPage ref="sonRef"></SonPage>
    <button @click="opSon">我要调用子组件</button>
  </div>
    <h1>父组件</h1>
</template>
  
<script setup>
import SonPage from './sonPage.vue'
import { ref } from 'vue'
const sonRef = ref();
  
const opSon = () => {
    sonRef.value.ParentOPSon('我是父组件调用子组件方法传入的参数')
}
</script>
  
<style scoped></style>
子组件

定义一个方法,并且使用defineExpose导出

<template>
    <div :style="{border: '1px solid red'}">
      <h1>子组件</h1>
  <div>这是父组件调用子组件方法传入的参数:{{msg2}}</div>
    </div>
  </template>
  
  <script setup>
import { ref , defineExpose} from 'vue';
const msg2 = ref('');
const ParentOPSon= (parentMsg)=>{
  msg2.value=parentMsg
}

//导出给父组件调用
defineExpose({
  ParentOPSon
})

  </script>
  <style scoped></style>
  
结果

3、子组件调用父组件方法

父组件

通过 <SonPage @opParent="onOpParent" /> 注册了对 opParent 事件的监听,并定义了一个 parentMethod 方法来处理这个事件。

<template>
    <div>
        <SonPage @opParent="parentMethod"></SonPage>
    </div>
    <div>我是子组件调用父组件方法传入的参数:{{ sonMsg }}</div>
    <h1>父组件</h1>
</template>
  
<script setup>
import SonPage from './sonPage.vue'
import { ref } from 'vue'
const sonMsg = ref();
//子组件调用父组件方法
const parentMethod = (e) => {
    console.log('子组件调用父组件方法传入的参数', e)
    sonMsg.value = e
}
</script>
  
<style scoped></style>
子组件

注意在 defineEmits 中明确地声明您想要触发的所有自定义事件。

使用emit('opParent', '子组件调用父组件的方法');调用父组件方法,第一个参数需要与父组件中@名字一样

<template>
    <div :style="{border: '1px solid red'}">
      <h1>子组件</h1>
      <button @click="opParentFF">我要调用父组件的方法</button>
    </div>
  </template>
  
  <script setup>
import { defineEmits } from 'vue';
//声明自定义事件
const emit = defineEmits(['opParent']);
const opParentFF = () => {
  console.log('子组件调用父组件的方法');
  // 调用父组件的方法
  emit('opParent', '子组件调用父组件的方法');
};

  </script>
  <style scoped></style>
  
结果

看到这里就基本结束喽,如有变化后期会及时更新的~

本人小白一个

可能存在部分问题

欢迎大家批评指正哦~

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

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

相关文章

【网络爬虫篇】“逆向实战—某东:滑块验证码(逆向登录)”自动化实现滑块登录验证(2024.8.7)最新发布,包干货,包详细

【网络爬虫篇】更多优秀文章借鉴&#xff1a; 1. 使用Selenium实现黑马头条滑块自动登录 2. 使用多线程采集爬取豆瓣top250电影榜 3. 使用Scrapy爬取去哪儿网游记数据 4. 数据采集技术综合项目实战1&#xff1a;国家水稻网数据采集与分析 5. 数据采集技术综合项目实战2&#x…

【leetcode】根据二叉树创建字符串、二叉树的前中后遍历(非递归链表实现二叉树)

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;数据结构、LeetCode专栏 &#x1f4da;本系…

扫地机/洗地机语音芯片ic,工业级声音播放芯片ic,NV170H

扫地机/洗地机作为智能家居清洁领域的创新驱动力&#xff0c;不仅赋予了清洁设备&#xff0c;还需要一些智能化的功能&#xff0c;比如语音提示&#xff0c;将用户体验提升至全新高度。NV170H语音芯片成为了首要选择。 NV170H语音芯片是一款OTP&#xff08;‌一次性可编程&…

html+css网页设计 酷狗首页1个页面 (无js)

htmlcss网页设计 酷狗首页1个页面无js功能 页面还原度80% 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 …

干货满满!Stable Diffusion 从入门到精通之提示词手册,免费分享,自学转行,零基础首选!

前言 Stable Diffusion 技术把 AI 图像生成提高到了一个全新高度&#xff0c;文生图 Text to image 生成质量很大程度上取决于你的提示词 Prompt 好不好。本文从“如何写好提示词”出发&#xff0c;从提示词构成、调整规则和 AIGC辅助工具等角度&#xff0c;对文生图的提示词输…

腾讯云AI代码助手评测:如何智能高效完成Go语言Web项目开发

腾讯云AI代码助手评测&#xff1a;如何智能高效完成Go语言Web项目开发 &#x1f680; 文章目录 腾讯云AI代码助手评测&#xff1a;如何智能高效完成Go语言Web项目开发 &#x1f680;背景引言开发环境介绍腾讯云AI代码助手使用实例1. 代码补全2. 技术对话3. 代码优化4. 规范代码…

LVS实验(实现服务器集群的负载均衡)

基本概念 LVS&#xff08;Linux Virtual Server&#xff09;是Linux虚拟服务器的简称。 LVS通过将一个真实服务器集群虚拟成一台服务器来对外提供服务&#xff0c;同时在集群内部实现负载均衡。这种技术能够显著提高服务的处理能力和可靠性&#xff0c;降低单台服务器的负载压…

C++——类和对象(part1)

前言 本篇博客来为大家介绍C中的一个重要内容——类与对象&#xff0c;这部分的内容较多&#xff0c;将会分三篇文章来介绍&#xff0c;本篇为第一篇&#xff0c;如果你学习C或对C感兴趣&#xff0c;那么请继续往下阅读&#xff0c;下面进入正文部分。 1. 类的定义 1.1 类定…

【Material-UI】Button Group:实验性 API 详解

文章目录 一、按钮组概述1. 组件介绍2. 基本用法 二、实验性 API 详解1. LoadingButton 组件1.1 基本用法1.2 位置属性 三、实验性 API 的应用场景1. 数据加载按钮2. 提交表单按钮3. 保存操作按钮 四、按钮组的样式定制1. 变体&#xff08;Variants&#xff09;2. 颜色&#xf…

解决Ubuntu/Kali手动创建的启动器在dock上没有图标,且不能“添加到dock中“的问题

文章目录 问题描述问题解决解决方案 1 | 添加StartupWMClass字段解决方案 2 | 重命名文件名 如何获取 WM 值&#xff1f;方式 1 | xprop 命令方式 2 | 直接查看 问题描述 这个启动器无论是在菜单还是桌面都是正常的&#xff0c;只有在dock中没有图标&#xff0c;且不像其他APP…

《向量数据库指南》——非结构化数据的行业需求及向量数据库的关键角色

非结构化数据的行业需求及向量数据库的关键角色 引言 在当今数字化时代,数据已成为驱动社会进步与产业升级的核心要素。随着技术的飞速发展,特别是人工智能(AI)技术的广泛应用,数据的类型与规模正以前所未有的速度增长。其中,非结构化数据作为数据海洋中的主体部分,其…

同态加密和SEAL库的介绍(六)BGV 方案

前面介绍 BFV 和 CKKS 加密方案&#xff0c;这两者更为常用。并且也解释了 Batch Encoder 和 级别的概念&#xff0c;这对接下来演示 BGV 会很有帮助。 一、BGV简介 BGV (Brakerski-Gentry-Vaikuntanathan) 方案 是一种基于环学习同态加密&#xff08;RLWE&#xff09;问题的加…

霍尼韦尔落地灯怎么样?书客、霍尼、柏曼护眼大路灯多维度实测

霍尼韦尔落地灯怎么样&#xff1f;护眼大路灯作为最适合新时代学生照明工具&#xff0c;以良好的作用表现得到了许多家长及社会人士的认同&#xff0c;但同时也因为火爆&#xff0c;市面上的品牌繁杂&#xff0c;出现了许多劣质或者不专业的产品&#xff0c;促使一些人不知道如…

学习java的日子 Day64 学生管理系统 web2.0 web版本

MVC设计模式 概念 - 代码的分层 MVC&#xff1a;项目分层的思想 字母表示层理解MModle模型层业务的具体实现VView视图层展示数据CController控制器层控制业务流程&#xff08;跳转&#xff09; 1.细化理解层数 Controller&#xff1a;控制器层&#xff0c;用于存放Servlet&…

中职云计算实训室

一、实训室建设背景 随着信息技术的飞速发展&#xff0c;云计算已成为推动数字化转型、促进经济社会发展的重要力量。《中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要》明确提出&#xff0c;要加快数字化发展&#xff0c;建设数字中国。云计算作为数…

我的创新大赛经验分享:打造一份出色的商业计划书

我的创新大赛经验分享&#xff1a;打造一份出色的商业计划书 前言封面和目录&#xff1a;第一印象至关重要执行摘要&#xff1a;一语中的项目背景&#xff1a;市场与行业的深度剖析产品/服务&#xff1a;展现独特性和竞争力市场分析&#xff1a;深入洞察目标市场商业模式&#…

等保测评练习卷30

等级保护初级测评师试题30 姓名&#xff1a; 成绩&#xff1a; 一、判断题&#xff08;10110分&#xff09; 1.要想使用远程桌面的SSL加密功能&#xff0c;运行的操作系统必须为Windows 2000 Server或以上版本。&#xf…

排序算法1:堆排序,直接插入排序与希尔排序

前言 前些时间&#xff0c;博主带领着大家学习了数据结构&#xff0c;数据结构中的二叉树更是其中的重中之重&#xff0c;我们之前了解了二叉树是现实计算机存储数据的一种重要形式。借助其结构&#xff0c;我们还能实现更多高效的功能。 今天我们将进入排序算法的章节&#…

Spring MVC框架学习笔记

学习视频:10001 Spring MVC概述_哔哩哔哩_bilibili~11005 请求映射方式_哔哩哔哩_bilibili 目录 1.概述 Java EE三层架构 Spring MVC在三层架构中的位置 ​编辑 Spring MVC在表现层的作用 Spring MVC的特点 2.Spring MVC入门程序 代码实现 Spring MVC工作原理 Spring …

ETF套利有什么好用的软件?ETF套利神器—万得宏汇

ETF套利全场景覆盖&#xff0c;支持瞬时、趋势、事件套利等业务场景。丰富的组合交易工具、灵活高效的窗口设置&#xff0c;叠加ETF利润计算器联动&#xff0c;让ETF投资更轻松。 L2行情极速柜台&#xff0c;交易快人一步 市场行情瞬息万变&#xff0c;行情速度决定交易速度&a…