vue3一些API使用总结:
$refs:
<template>
<div ref="root" @click="handleClick"</div>
</template>
setup(props, ctx){
const root = ref(null)
const handleClick = () => {
console.log(root)
}
return {
root
}
}
声明周期
beforeCreate(删除) -> 使用 setup()
created(删除) -> 使用 setup()
beforeMount -> onBeforeMount
mounted -> onMounted
beforeUpdate -> onBeforeUpdate
updated -> onUpdated
beforeDestroy -> onBeforeUnmount
destroyed -> onUnmounted
errorCaptured -> onErrorCaptured
onRenderTracked
onRenderTriggered
provide 和 inject
import { provide, inject } from 'vue'
const ThemeSymbol = Symbol()
const Ancestor = {
setup() {
provide(ThemeSymbol, 'dark')
},
}
const Descendent = {
setup() {
const theme = inject(ThemeSymbol, 'light' )
return {
theme,
}
},
}
const themeRef = ref('dark')
provide(ThemeSymbol, themeRef)
const theme = inject(ThemeSymbol, ref('light'))
watchEffect(() => {
console.log(`theme set to: ${theme.value}`)
})
vuex,vue-router,ElementUI 的一些 $方法可以从 root 中取得
export default {
setup(props, ctx) {
const { $store, $router, $route, $message, $confirm } = ctx.root
}
}
getters
export default {
setup(props, ctx) {
const { $store } = ctx.root
const permissions = computed(() => $store.getters.permissions)
const canUpdate = () => permissions.includes('update')
const canDelete = () => permissions.includes('delete')
return {
canUpdate,
canDelete
}
}
}
import { computed } from 'vue'
import { useStore } from 'vuex'
const module = 'myModule'
export default {
setup() {
const store = useStore()
return {
one: computed(() => store.getters[`${module}/myStateVariable`],
two: computed(() => store.state[module].myStateVariable,
}
}
}
$store
setup(props, ctx){
const {$store} = ctx.root
console.log($store)
}
message,router, confirm,store
import { computed, onCreated } from 'vue-function-api'
export default {
setup(props, ctx) {
const { $message, $router, $confirm, $store } = ctx.root
const fetchCity = async () => {
const response = await fetchCityApi()
citys.value = response.data
}
const fetchList = async () => {
const response = await fetchListApi(query.value)
list.value = response.data
}
const delete = async id => {
const response = await deleteItem(id)
const { status, msg } = response.data
if (status !== 'ok') return $message.error(msg)
$message({
type: 'success',
message: '删除成功'
})
}
confirm(id) {
$confirm(`确认删除`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
delete(id)
}).catch(() => {
$message({
type: 'info',
message: '已取消'
})
})
}
detail(id) {
$router.push({
path: '/detail',
query: { id }
})
}
onCreated(() => {
fetchCity()
fetchList()
})
return {
fetchCity,
fetchList,
confirm,
detail
}
}
}
watch
import { watch } from 'vue-function-api'
export default {
setup() {
watch(
query,
val => {
fetchList()
},
{ deep: true }
)
watch(
() => query.value,
val => {
fetchList()
},
{ deep: true }
)
}
}
vuex,vue-router,ElementUI 的一些 $方法可以从 root 中取得
export default {
setup(props, ctx) {
const { $store, $router, $route, $message, $confirm } = ctx.root
}
}
vuex4
import { createApp } from 'vue'
import { createStore } from 'vuex'
const store = createStore({
state () {
return {
count: 0
}
},
mutations: {
increment (state) {
state.count++
}
}
})
const app = createApp({ })
app.use(store)
import { useStore, mapState, mapGetters} from 'vuex'
export default {
step(){
const store = useStore()
store.commit('increment')
console.log(store.state.count)
store.getters.doneTodos
},
computed: mapState({
count: state => state.count,
countAlias: 'count',
countPlusLocalState (state) {
return state.count + this.localCount
}
})
computed: {
...mapGetters([
'doneTodosCount',
'anotherGetter',
])
}
}