本文共 7293 字,大约阅读时间需要 24 分钟。
不知不觉已经记录了这么多的知识点,更新一下吧。
可能比较杂乱,请谅解。ref()
和reactive()
函数都是定义响应式数据的函数,ref
更倾向于定义简单类型和数组,reactive
定义对象reactive
所定义的响应式对象,会让其失去响应式。应用...toRefs
方法setup()
中使用,2.x原有的不需要onRenderTracked
,onRenderTriggered
跟踪发生变化的值,调试用onBeforeMount(() => { console.log('挂载前') }) onMounted(() => { console.log('挂载完成') }) onBeforeUpdate(() => { console.log('数据更新前') }) onUpdated(() => { console.log('数据更新完成') }) onBeforeUnmount(() => { console.log('卸载组件前') }) onUnmounted(() => { console.log('卸载组件完成') })
watch
//第一个参数数组,是要监视的值,发生变化则触发钩子,数组里是getter格式函数watch([() => data.overText, () => data.selectedGirl], (newVal, oddVal) => { if (newVal[0] !== oddVal[0]) { document.title = newVal[0] } })
toRefs()
用于将被reactive()
建造出来的响应对象变为普通对象,但对象里的属性都具有响应式。{ { name }}
{ { age }}
{ { gender }}
loading...
Teleport
将组件挂载到某个DOM节点上,而不一定是#app
上 #app
)import { defineComponent, reactive, computed, toRefs} from 'vue';interface User { name: string, age: number, score: number, pet: { name: string, type: string }}export default defineComponent({ name: 'App', setup() { const userinfo: User = reactive({ name: 'zed', age: 18, score: 60, pet: { name: 'jeff', type: 'cat' } }) const gt60 = computed(() => { return userinfo.score >= 60 }) const introduce = computed(() => { return `${ userinfo.name},今年${ userinfo.age}岁,我的宠物叫${ userinfo.pet.name},是一只${ userinfo.pet.type}` }) return { ...toRefs(userinfo), gt60, introduce} }});
readonly
const article = reactive({ title: '错把妻子当帽子', content: '神经病例' })const ac = readonly(article)
props
export default { props: { title: String}, setup(props: any) { const titleP = ref(`这是一个标题:${ props.title}`) return { titleP} }
provide inject
setup() { const article = reactive({ title: '错把妻子当帽子', content: '神经病例' }) const updateFoo = ()=>{ foo.value = '111' } let foo = ref('你好') provide('article', readonly(article)) provide('foo', readonly(foo)) provide('updateFoo',updateFoo) return { foo, article} }
- 子组件中
setup() { let foo = inject('foo') let article = inject('article') const updateFoo = inject('updateFoo') return { foo, article, updateFoo} }
reactive
来说有三种ref
只能用泛型//1.泛型 const book = reactive({ title: 'title', author: 'author' }) //2.断言 const book = reactive({ title: 'title', author: 'author' }) as Book //3. 类型声明 const book:Book = reactive({ title: 'title', author: 'author' }) //ref 只能 泛型 const title = ref ('这是一个标题')
//路由配置path: '/article/:aid'//跳转配置
//路由配置path: '/article'//跳转配置{ { item }} //如何获取我是{ { $route.query.aid}}文章页面
children
中的path
,不需要加/
redirect
,写成redirect: /user/userlist
vuex
在组合式API,即setup()
中的使用 this.$store
来获取,要先引入useStore
,然后创建实例,通过实例来获取其中的方法和属性setup()
中,才能获得响应式import { useStore } from 'vuex'setup(){ const store = useStore()}
vuex
在ts中的写法import { createStore} from "vuex";const store = createStore({ state: { authName: 'zed', bookList: ['错把妻子当帽子', '三体', 'js高级程序设计第三版', '撒哈拉的故事'] }, mutations: { changeName(state, name) { state.authName = name } }})export default store
//尝试改变返回简单值得计算属性的值,vue会抛出警告//Write operation failed: computed value is readonly
ref
name
赋值时,如果不加.value
,那么新添加的book
的name
都会绑定同一个name
let name = ref('')books.value.unshift({ id: id++, name: name.value, price: 127})
async setup
中使用生命周期函数,要放在第一个await
之前setup(props, context)
,第二个参数中的emit
即为vue2中的this.$emit
,可用结构的语法写,即setup(props, { emit })
refresh
方法$ npm i vant@next
$ npm i babel-plugin-import -D
main.ts
中引入import 'vant/lib/index.css'
import {Swipe, SwipeItem} from "vant";
,并在这个组件中注册子组件components: {[Swipe.name]: Swipe, [SwipeItem.name]: SwipeItem}
vant
,可以在main.ts
中引入并配置 Lazyload
,且将项目中需要懒加载的图片src
改为v-lazy
import { createApp} from 'vue'import App from './App.vue'import router from './router'import store from './store'import 'vant/lib/index.css'import { Lazyload, SwipeItem, Swipe} from 'vant'createApp(App) .use(Lazyload, { loading: require('./assets/img/book.svg') }) .use(Swipe) .use(SwipeItem) .use(store).use(router) .mount('#app')
van-badge
标签包裹需要徽标的图标,指定内容长度和最大长度v-bind
绑定动态参数 <a :[myHref]="myLink"></a>
myHref
是在data
中的动态属性名@click='fn(arg1,$event)'
arg1
是自定义参数$event
是鼠标事件@click='fn1(),fn2(),fn3()'
watch
监听数据变化,但是比较耗费性能props:[key1,key2...]
只能传值,无验证功能,可以改为props:{}
v-bind
this
,则是传输的是父组件的实例,可以访问到所有属性和方法-
来命名事件,即send-msg
7.3 兄弟组件mitt
// 之前(Vue 2.x)Vue.prototype.$http = () => { }// 之后(Vue 3.x)const app = Vue.createApp({ })app.config.globalProperties.$http = () => { }
// @/stores/index.ts中的写法import Vue from "vue";import Vuex from "vuex"import ActionHelper from "@/stores/ActionHelper";Vue.use(Vuex)export default new Vuex.Store({ state: { globalProperty: '全局属性', ah: new ActionHelper() }, mutations: { logProperty(state) { console.log(state.globalProperty) } }})// main.js 中的写法import Vue from 'vue'import App from './App.vue'import store from './stores'Vue.config.productionTip = falsenew Vue({ render: h => h(App), store}).$mount('#app')//使用方法fn() { alert(this.$store.state.globalProperty) this.$store.commit('logProperty') }
如果对你有帮助的话,请点一个赞吧
转载地址:http://frozi.baihongyu.com/