什么是Vue3
MVVM是Model-View-ViewModel的缩写,它是一种前端架构模式。Vue就是一种使用MVVM架构的前端框架。
在MVVM架构中,Model表示数据模型,View表示用户界面,ViewModel是Model和View之间的中介者。ViewModel通过双向数据绑定将Model和View连接起来,当Model发生变化时,ViewModel会自动更新View,反之亦然。
与其他前端JavaScript框架相比,Vue的最大优势就是其轻量级和简单易用。Vue的核心库只关注视图层,不涉及其他方面,因此体积较小、易于上手,同时也具有很好的性能表现。
Vue 3相比于Vue 2,有一些全新的理念和改进,包括:
总之,Vue是一个功能强大、易于学习和使用的前端框架,而Vue 3则在性能和开发体验等方面进行了进一步的提升。
Vue(选项式2.0,组合式3.0更好)
选项式 API 还是 组合式 API✔️
HTML 还是 单文件组件✔️
语法(要用到ts的一些特性,但主要的还是js语法)
构建工具(vite更轻量,构建速度更快)
路由
共享存储(pinia更好用)
视图组件(都是组件库,一个饿了么,一个啊里)
这是学完之后补充的笔记,一览从学习接触Vue到工作开发使用Vue的方式的变迁~
所谓的选项卡,Vue2老项目使用的技术,总体感觉就是不宜扩展,灵活性差于Vue3
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Calculator</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<input type="number" v-model="num1">
<select v-model="operator">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
</select>
<input type="number" v-model="num2">
<button @click="calculate">Calculate</button>
<!-- <span>=</span> -->
<span>{{ result }}</span>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
num1: 0,
num2: 0,
operator: '+',
result: 0
},
watch: {
num1: function() {
this.calculate();
},
num2: function() {
this.calculate();
},
operator: function() {
this.calculate();
}
},
methods: {
calculate: function() {
switch(this.operator) {
case '+':
// 果然还是ts好...
this.result = Number(this.num1) + Number(this.num2);
break;
case '-':
this.result = this.num1 - this.num2;
break;
case '*':
this.result = this.num1 * this.num2;
break;
case '/':
this.result = this.num1 / this.num2;
break;
}
}
}
})
</script>
</body>
</html>
自由且灵活
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Calculator</title>
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="app">
<input type="number" v-model="state.num1">
<select v-model="state.operator">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
</select>
<input type="number" v-model="state.num2">
<!-- <button @click="calculate">Calculate</button> -->
<span>={{ result }}</span>
</div>
<script>
const { reactive, computed } = Vue;
const App = {
setup() {
const state = reactive({
num1: 0,
num2: 0,
operator: '+',
});
const result = computed(() => {
switch (state.operator) {
case '+':
return Number(state.num1) + Number(state.num2);
case '-':
return state.num1 - state.num2;
case '*':
return state.num1 * state.num2;
case '/':
return state.num1 / state.num2;
}
});
// const calculate = () => state.result = result.value;
return { state, result };
},
};
Vue.createApp(App).mount('#app');
</script>
</body>
</html>
加入了语法糖可以不用考虑那么多繁文琐节了(当然了由于这是html所以还有一些局限性,如果是单文件组件甚至不需要去编写setup函数和手动导出方法和变量了)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Calculator</title>
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="app">
<input type="number" v-model="state.num1">
<select v-model="state.operator">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
</select>
<input type="number" v-model="state.num2">
<!-- <button @click="calculate">Calculate</button> -->
<span>={{ result }}</span>
</div>
<script setup>
import { reactive, computed, createApp } from 'vue';
const state = reactive({
num1: 0,
num2: 0,
operator: '+',
});
const result = computed(() => {
switch (state.operator) {
case '+':
return Number(state.num1) + Number(state.num2);
case '-':
return state.num1 - state.num2;
case '*':
return state.num1 * state.num2;
case '/':
return state.num1 / state.num2;
}
});
// const calculate = () => state.result = result.value;
createApp({
setup() {
return { state, result };
},
}).mount('#app');
</script>
</body>
</html>
使用了 <script setup>,代码中不再需要使用 Vue.createApp,而是需要使用 createApp 函数来创建 Vue 应用。同时,Vue 对象的引入也可以通过 import 的方式进行。
<script>标签默认情况下不支持使用ES模块的import语法,因为浏览器不支持直接加载ES模块。如果你想在<script>标签中使用import语法,你需要使用一些工具,比如Webpack或者Rollup,来将你的代码打包成浏览器可以执行的形式。当然,现代浏览器也开始支持<script type="module">标签,你可以在这个标签中使用import语法,但是它的兼容性还不太好,不建议在生产环境中使用。如果你想在浏览器中使用import语法,可以尝试使用CDN提供的库,比如ES6模块标准的库@std/esm。
只是一个例子,和前面的代码案例无关了。在工程级的项目开发中都会使用这种模式,编写单个的组件完成独立的功能模块,然后在Vue的根组件中挂载。
每个组件都由模板template、脚本script和style样式三部分组成(当然了这是单文件组件,除此之外还有纯粹的函数式组件)
<!--通用页眉组件-->
<template>
<footer>
<div class="center">
<span>Copyright ©{{ startYear }}-{{ currentYear }} {{ author }} </span>
<span v-if="icpNumber" class="icp-number">
<a href="http://beian.miit.gov.cn" target="_blank">{{ icpNumber }}</a>
</span>
</div>
</footer>
</template>
<script lang="ts" setup>
interface PageFooterProps {
startYear: number;
author: string;
icpNumber?: string;
}
const props = defineProps<PageFooterProps>();
const currentYear = new Date().getFullYear();
</script>
<style lang="less" scoped>
footer {
background-color: #f3f4f5;
display: flex;
justify-content: center;
align-items: center;
padding: 10px;
.center {
text-align: center;
color: #4e77ab;
a {
text-decoration: none;
color: #4979ff;
}
}
}
</style>