vue3的基本使用
vue3的基础使用;
安装vite:npm inistall -g create-vite-app
利用vite创建vue3项目:create-vite-app projectName
安装依赖运行项目:cd projectName npm install npm run dev
文档地址:https://v3.vuejs.org/guide/introduction.html
composition API的本质其实就是把setup()中的方法和数据注册到data/methods中;
ref定义简单类型的数据, reactive定义复杂类型的数据;
vue3基本使用方式
import {ref , reactive} from 'vue' // reactive只有传入复杂类型(json/arr)才会成为响应式
export default {
name: 'App',
// setup函数是组合api的入口函数
// 执行时机在beforeCreate之前,所以此时是无法使用data/methods
// 由于不能在setup不能访问data/methods,此时的this的值为undefined
// setup只能是同步的
setup () {
let {state, deleteLine} = diyFun()
let count = ref(0)
return {state, deleteLine, count} // 暴露出去之后就可以使用这些变量了
}
}
function diyFun() {
let state = reactive({
stus: [
{id: 1, name: 2, age: 3},
{id: 2, name: 3, age: 4},
{id: 3, name: 4, age: 5},
{id: 4, name: 5, age: 6}
]
})
function deleteLine(index) {
console.log(index)
state.stus.splice(index, 1)
}
return {state, deleteLine}
}
reactive注意点:
reactive传递的参数必须是object/arr
如果传递了其他的对象,默认情况下修改对象,界面不会自动更新,如果想要
更新,可以通过重新赋值的方式
// 重新赋值
function changeTime() {
let stateDate = reactive({
time: new Date()
})
function changeDetail() {
let data = new Date(stateDate.time.getTime())
data.setDate(stateDate.time.getDate() + 1)
stateDate.time = data
}
return {stateDate, changeDetail}
}
ref的本质其实还是reactive,当我们给ref函数传递一个值之后,ref
函数会自动的转化成{value: xx},只是中间自动帮我们套了一层value
const name = ref(1) => name: {value: 1}
所以当我们修改值时,name.value = ‘xxx',此时才能进行响应式更新.
同理: shallowRef本质上也是shallowReactive
递归监听(通过ref和reactive来创建得数据)
在多层嵌套得对象中,vue3会递归每一层对象,并对每一层对象创建一个proxy进行监听,所以非常消耗性能,
let obj = reactive({
a: {
b: 'v',
c: {
d: '666',
e: {
f: '7777'
}
}
}
})
非递归监听 shallowReactive shallowRef, 只会监听最外一层
修改, 单独修改obj.a.b是不会重新渲染得,因为是没有被proxy监听得,
只有同时修改了obj得第一层属性值才会重新渲染,只有obj被proxy监听了
let obj = shallowReactive({
name: '11111',
a: {
b: 'v',
c: {
d: '666',
e: {
f: '7777'
}
}
}
})
// 修改, 单独修改obj.a.b是不会重新渲染得,因为是没有被proxy监听得,
// 只有同时修改了obj得第一层属性值才会重新渲染,只有obj被proxy监听了
obj.name = 'zhangsan'
obj.a.b = '7777777'
通过shallowRef创建得数据,监听得是obj.value得值,修改方式如下,将整个对象提出来修改
如果只想单独修改一个值, 配合triggerRef(obj)使用,此时会重新渲染界面
注意:没有triggerReactive()方法
obj.value = {
name: 'asdasdasd',
a: {
b: 'asdasdasd',
c: {
d: '66132126',
e: {
f: '7123123777'
}
}
}
}
// 如果只想单独修改一个值, 配合triggerRef(obj)使用,此时会重新渲染界面
// 注意:没有triggerReactive()方法
obj.value.name = 'asdasdasd123123'
triggerRef(obj)
toRaw方法,在有些情况下,我们修改了reactive/ref中得数据得时候,并不希望他去更新UI
但是他本身是响应式得,此时可以使用toRaw来避免这种更新达到提升性能得作用
reactive创建得数据
let obj2 = toRaw(obj)
obj2.name = '123123123123' // 此时obj中proxy代理得值也发生变化了,但是界面没有更新
// ref创建得数据想使用toRow得话
let obj2 = toRaw(obj.value) // 因为ref本质还是reactive
obj2.name = '123123123123'
markRow 使某个值永远不会响应式
let obj = {a: 1, b: 2}
obj = markRow(obj)
let state = reactive(obj) //此时state的值再发生修改就不会重新渲染了
toRef和ref定义数据
let obj = {a: 1, b: 2}
let state = ref(obj.a)
let state = toRef(obj, name)
/*
此时修改state.value的值。obj中对应的a的值不会更改,但是UI会自动更新
如果使用的是toRef,在修改了数据之后,obj的值会跟着变化,但是UI不会更新
*/
也可以使用toRefs
let state = toRefs(obj) // 直接遍历obj中所有的属性,作用和toRef差不多,修改原始数据
vue3中使用生命周期函数和获取dom得方式
使用生命周期->引入对应得生命周期函数,在setup中使用onMounted()
// <div ref="box"> 123123123</div>
let box = ref(null) // 定义一个空的ref数据,将该数据暴露出去给节点绑上ref值
onMounted(() => {
console.log(box.value) // 即可拿到节点对象
})
return {box}
readonly:创建一个只读的数据,并且是递归只读
let state = readonly({name: 1, attr: {a:1, b: 2})
shallowReadonly:用于创建一个只读的数据,但不是递归只读的,只能用于第一层
isReadonly()用于判断该值是不是只读的