Vue3
Vite构建+配置
使用yarn初始化项目
yarn create vite
Vite配置
修改默认端口
server: {
port: 8081
}
跨域问题
server: {
port: 8081,
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
}
}
}
Vue
Ref与Reactive
ref修改需要value,reactive不需要
- ref 能将任意类型的数据变为【响应式】的,Ref也可以像reactive一样包装对象
- reactive 只能将对象类型变为【响应式】,对基本类型无效(例如 string,number,boolean)
const msg = ref("hello world")
const user = reactive({
name: "zhangsan",
age: 18
})
function change() {
msg.value = "hello vue3"
user.name = "lisi"
user.age = 20
}
页面中使用:不需要value
<h1>{{ msg }}</h1>
姓名: {{ user.name }}<br>
年龄: {{ user.age }}
属性绑定
- 【:属性名】用来将标签属性与【响应式】变量绑定
这个是单向绑定,代码中属性变量,页面也变,但是页面变了,代码中不会改变
要双向绑定需要使用v-model
const buttonName=ref("按钮")
<input type="button" :value="buttonName">
事件绑定
- 使用@click进行绑定
<h2>{{count}}</h2>
<input type="button" value="+" @click="add">
<input type="button" value="-" @click="del">
const count = ref(0)
function add() {
count.value++
}
function del() {
count.value--
}
表单绑定
- 用 v-model 实现双向绑定,即
- javascript 数据可以同步到表单标签
- 反过来用户在表单标签输入的新值也会同步到 javascript 这边
- 双向绑定只适用于表单这种带【输入】功能的标签,其它标签的数据绑定,单向就足够了
- 复选框这种标签,双向绑定的 javascript 数据类型一般用数组
const user1 = ref({
name: "zhangsan",
age: 18,
sex: "男",
hobby: ["吃饭", "睡觉", "打豆豆"]
})
<div class="outer">
<div>
<label for="name">姓名:</label>
<input type="text" id="name" v-model="user1.name">
</div>
<div>
<label for="age">年龄:</label>
<input type="text" id="age" v-model="user1.age">
</div>
<div>
<label for="sex">性别:</label>
男 <input type="radio" value="男" v-model="user1.sex">
女 <input type="radio" value="女" v-model="user1.sex">
</div>
<div>
<label for="hobby">爱好:</label>
吃饭 <input type="checkbox" value="吃饭" v-model="user1.hobby">
睡觉 <input type="checkbox" value="睡觉" v-model="user1.hobby">
打豆豆 <input type="checkbox" value="打豆豆" v-model="user1.hobby">
</div>
<div>
<input type="button" value="提交" @click="saveUser">
</div>
</div>
计算属性
- 有缓存功能
const firstName = ref("张")
const lastName = ref("三")
const fullName = computed(() => {
return firstName.value + lastName.value
})
{{ fullName}}
监听器
const name = ref("张三")
watch(name, (newVal, oldVal) => {
console.log(newVal, oldVal)
})
<input type="text" v-model="name">
组件
子组件如下:
通过defineProps定义属性,使用插值表达式使用,非可选加?
<template>
<div class="container">
<div class="card">
<div>
<p class="name">{{ name }}</p>
<p class="location">{{ country }}</p>
</div>
<img :src="avatar || '/src/assets/vue.svg'"/>
</div>
</div>
</template>
<script setup lang="ts">
defineProps<{ name: string, country: string, avatar?: string }>()
</script>
父组件使用:
<Child country="北京" name="蔡徐坤" />
<Child country="南京" name="蔡徐坤啊" avatar="/vite.svg" />
Vueuse
安装
npm i @vueuse/core
使用
<div>
X:{{ X }} <br>
Y:{{ Y }}
</div>
const {X, Y} = useMouse()
VueRequest
安装
yarn add vue-request
使用
配合计算属性一起用
const {data} = useRequest<AxiosRespList<Student>>(() => axios.get("/api/students"))
const students = computed(() => {
return data?.value?.data.data || []
})
<h3 v-if="students.length===0">暂无数据</h3>
<ul v-else>
<li v-for="item in students" :key="item.id">
{{ item.name }}
</li>
</ul>
Axios
安装
yarn add axios
简单实用
const getStudent = async () => {
// const res = await axios.get("http://localhost:8080/api/students")
const res = await axios.get("/api/students")
console.log(res)
}
onMounted(() => {
getStudent()
})
注意跨域问题:
本地发请求必须是:http://localhost:7070/ ,不可以写为127.0.0.1
环境变量
区分开发环境和生产环境,这件事交给构建工具 vite 来做
默认情况下,vite 支持上面两种环境,分别对应根目录下两个配置文件
- .env.development - 开发环境
- .env.production - 生产环境
针对以上需求,分别在两个文件中加入
VITE_BACKEND_API_BASE_URL = 'http://localhost:8080'
VITE_BACKEND_API_BASE_URL = 'http://xxx.com'
然后在代码中使用 vite 给我们提供的特殊对象 import.meta.env
,就可以获取到 VITE_BACKEND_API_BASE_URL
在不同环境下的值
import.meta.env.VITE_BACKEND_API_BASE_URL