vue3 🔗
vite 🔗
vite 是 vue3 的构建工具。使用 ES Module 导入来提供代码,不使用 webpack 工具。
webpack 的工作流程
- 读取
webpack.config.js配置 - 解析 entry 指定的入口文件,分析代码中的模块依赖
-
使用 loaders 转换代码。(如 typescript 转为 javascript, sass 转为 css) 🔗
-
使用 plugins 进行额外优化(压缩代码,生产 html 文件) 🔗
- 将最后的 js,css,html 代码输出到 dist 目录中
创建第一个 vite 项目 🔗
npm init vue@latest
npm create vite@latest cd project && npm instasll && npm run dev
http://localhost:3000
🔗
npm init -y , npm i @solana/web3.js
遇到的问题 🔗
启元前端 🔗
prettier ESlint 有交集,有冲突的部分。
在该 vue 模版时,vs code 里按了 tab 键,被 prettier 爆出错误如下。
Delete · prettier/prettier
error Delete ␍ prettier/prettier
把相关文件放到 ignore 中,忽略检查。
vue 🔗
redner 自定义组件时无法显示。
img src 相对路径不生效,绝对路径可以。
ES6 module 🔗
Module ‘“xx.vue“‘ has no default export.Vetur(1192) 选择卸载 vetur,安装 volar 插件
封装自定义指令 🔗
directive函数
import createApp from "vue";
import App from "./App.vue";
const app = createApp(App);
// 指令名称是 highlight,
app.directive("highlight", {
// 在哪个阶段的生命周期中执行 指令函数。
mounted(el, binding) {
el.style.backgroundColor = binding.value || "red";
},
});
// <p v-highlight> xyz </p>
自定义指令的修饰符 🔗
app.directive("highlight", {
mounted: function(el, binding) {
if (binding.modifiers.delay) {
setTimeout( ()=> {
el.style.backgroundColor = binding.value || "yellow";
})
} else
el.style.backgroundColor = binding.value || "yellow";
}
},
})
<p v-highlight.delay="lightblue">xyz</p>
v-model 如何实现父子组件的通信 🔗
通过 v-bind, 也就是:符号。
<template>
<p>父组件{{ param1 }}</p>
<p>父组件{{ param2 }}</p>
<Child v-model:p1="param1" v-model:p2="param2"></Child>
</template>
<script setup>
import Child from "./Child.vue";
import { ref } from "vue";
const param1 = ref("x");
const param2 = ref("y");
</script>
<script>
const emit = defineEmits(["update:p1", "upate:p2"]);
const updateP1 = () => {
emit("update:p1", "xx");
}
const updateP2 = () => {
emit(update:p2, "yy");
}
</script>
双向绑定 🔗
| 框架 | 数据 → 视图 | 视图 → 数据 | 实现方式 |
|---|---|---|---|
| Vue2 | Object.defineProperty |
input 事件监听 |
自动 |
| Vue3 | Proxy |
input 事件监听 |
自动 |
| Angular | Zone + 脏检查 | 表单指令 | 自动 |
| React | state 重渲染 |
onChange 手动同步 |
手动 |
<div id="app">
<input id="input" />
<p id="display"></p>
</div>
<script>
const obj = {};
const input = document.getElementById("input");
const display = document.getElementById("display");
Object.defineProperty(obj, "text", {
get() {
return this._text;
},
set(v) {
this._text = v;
display.textContent = v;
input.value = v;
},
});
input.addEventListener("input", (e) => {
obj.text = e.target.value;
});
obj.text = "Hello 双向绑定";
</script>
vue 与 react 的对比 🔗
vue 双向绑定, react 单向数据流。