keep-alive
blog.csdn.net/weixin_4966…
接收父组件传下来的值,调用父组件方法steup(props, context)
setup:
seuup(props, context){
let conut = ref(5)
const plus = () => {
count.value++
}
return {
count,
plus,
}
}
props参数:
props: {
title: String
},
setup(props) {
console.log(props.title)
}
{{props.title}}
context参数:
emits:['plus']
setup(props, context)
console.log(context.attrs)
console.log(context.slots)
console.log(context.emit)
context.emit('plus','需要传递的数据')
}
定义/修改数据
ref
let count = ref(5): 创建基本数据类型
return { count }
{{count}}
let count = ref({
a: 1,
b: 2
})
return { count }
{{count.a}}
unref:
console.log(unref(count))
console.log(unref(num))
reactive
const state = reactive({
count:5
})
{{state.count}}
return {state}
torefs:
const state = reactive({
foo: 1,
bar: 2
})
const fooRef = toRef(state, 'foo')
fooRef.value++
console.log(state.foo)
state.foo++
console.log(fooRef.value)
torefs:将响应式对象转换为普通对象,每个数据都是ref
const state = reactive({
foo: 1,
bar: 2
})
const stateAsRefs = toRefs(state)
return {
...stateAsRefs
}
{{foo}}
{{bar}}
isRef: 判断是不是ref数据
isRef(state)
customRef: 创建一个自定义的 ref,并对其依赖项跟踪和更新触发进行显式控制。它需要一个工厂函数,该函数接收 track 和 trigger 函数作为参数,并且应该返回一个带有 get 和 set 的对象。
function useDebouncedRef(value, delay = 200) {
let timeout
return customRef((track, trigger) => {
return {
get() {
track()
return value
},
set(newValue) {
clearTimeout(timeout)
timeout = setTimeout(() => {
value = newValue
trigger()
}, delay)
}
}
})
}
export default {
setup() {
return {
text: useDebouncedRef('hello')
}
}
}
shallowRef/triggerRef: 创建响应式对象,发生修改后变成没有响应式,值改变后watchEffect监听不到不变化,需要使用triggerRef手动触发
const info = shallowRef({
name: '张三'
})
let name = ''
watchEffect(() => {
name = info.value.name
console.log(name)
})
info.name.value = {
李四
}
isReactive(info.value)
triggerRef(info)
获取vue实例和vuex
const ctx = getCurrentInstance()
store = ctx.$store
const changCityInfo = () => {
store.commit('方法', 数据)
}
return {
changCityInfo,
}
监听数据,变化
conputed:
const count = ref(1)
const plusOne = computed(() => count.value + 1)
console.log(plusOne.value)
plusOne.value++
const count = ref(1)
const plusOne = computed({
get: () => count.value + 1,
set: val => {
count.value = val - 1
}
})
plusOne.value = 1
console.log(count.value)
readonly:
const original = reactive({ count: 0 })
const copy = readonly(original)
original.count++
copy.count++
watchEffect :
const stop = watchEffect((onInvalidate) => {
onInvalidate(() => {
})
}, {
flush: 'post'
})
stop()
watchEffect(() =>{},() => {
onTrack(e) {
},
onTrigger(e) {
debugger
}
})
watch:
ref数据时
watch(title, (newValue, oldValue) => {})
reactive数据时
watch(() => state.title
, (newValue, oldValue) => {})
watch(() => {
return [name.value, age.value]
}, ([newName, newAge], [oldName, oldAge]) => {
console.log(newName, oldName, newAge, oldAge)
})
生命周期
只能用在setup函数中,是同步的
1、去掉了vue2.0中的 beforeCreate 和 created 两个阶段,同样的新增了一个 setup
2、beforeMount 挂载之前 改名 onBeforeMount
3、mounted 挂载之后 改名 onMounted
4、beforeUpdate 数据更新之前 改名 onBeforeUpdate
5、updated 数据更新之后 改名 onUpdated
6、beforeDestroy 销毁前 改名 onBeforeUnmount
7、destoryed 销毁后 改名 onUnmounted
8、errorCaptured 捕获子孙组件发生错误 改名 onErrorCaptured(e => {})
9、renderTracked -> onRenderTracked
10、renderTriggered -> onRenderTriggered
依赖注入
Vue2.0
provide: {
name: '张三'
}
provide() {
return {
name: this.name
}
}
provide() {
return {
name: Vue.computed(() => this.name)
}
}
inject:['name']
Vue3.0
setup() {
const name = ref('张三')
const changName = () => {
name = '李四'
}
provide('name', redonly('张三'))
provide('age')
provide('changName')
}
setup() {
const name = inject('name', '无名')
const age = inject('age')
const changName = inject('changName')
}
获取DOM元素(子组件,元素)
<template>
<div ref="myRef">获取单个DOM元素</div>
</template>
<script>
import { ref, onMounted } from 'vue';
export default {
setup() {
const myRef = ref(null);
onMounted(() => {
console.dir(myRef.value);
});
return {
myRef
};
}
};
</script>
<template>
<div>获取多个DOM元素</div>
<ul>
<li v-for="(item, index) in arr" :key="index" :ref="setRef">
{{ item }}
</li>
</ul>
</template>
<script>
import { ref, nextTick } from 'vue';
export default {
setup() {
const arr = ref([1, 2, 3]);
const myRef = ref([]);
const setRef = (el) => {
myRef.value.push(el);
};
nextTick(() => {
console.dir(myRef.value);
});
return {
arr,
setRef
};
}
};
</script>
插件