Vue的一些常用高阶用法

一.Vuex篇

当需要使用Vuex中的状态state或方法mutations/actions时,简单的用法是这样的:
dom里:$store.state.hasLogined
scirpt里:this.$store.state.hasLogined

当项目Vuex仓库比较庞大时,推荐使用如下写法:
1.state/getters
computed: {
	...mapState(['state1','state2']),
	// 如果属性位于仓库的子模块里
	...mapState('module1', ['state3','state4'])
}

还有种写法:

computed: {
      ...mapState({
      		state1: state => state.mystate1,
      		state2(可自己命名): state => state.submodule(子模块).mystate2
      }),
      ...mapState('mymodule2', {
      		state3: state => state.mystate3
      })
}
2.mutations/actions
methods: {
	...mapMutations(['mutations1','mutations2']),
	...mapActions(['actions1','actions2'])
	// 如果位于仓库的子模块里,写法同上。
}
3.dispatch/commit
// 如果在.vue文件的js部分调用
// 常规调用
this.$store.commit('mymutation1');
this.$store.dispatch('myaction1');

// 如果mutation或action位于子模块中
this.$store.commit('subbmodule/mymutation2');
this.$store.dispatch('submodule/myaction2');

// 如果在vuex的js部分调用
// 如果一个仓库store有两个子模块,submodule1和submodule2,如果要在submodule1中调用submodule2的方法
// payload: 需要传递的参数
dispatch('submodule2/myaction', payload, { root: true })

二.侦听器watch篇

通常我们用watch只使用他的基本用法,如下:

watch: {
	myData(newValue, oldValue) {
		// doSomething
	}
}

其实watch用法还有两个属性,deep和immediate。

用法示例:
watch: {
	myData: {
		handler() {
			// doSomething
		},
		deep: true,
		immediate: true
	}
}
1.deep

在Vue2.x中,Vue 是不能检测到对象属性的添加或删除的。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 初始的data 对象上存在才能让 Vue 转换它,这样才能让它是响应的。因此使用deep: true属性会深入观察此对象,监听器会一层层的往下遍历,给对象的所有属性都加上这个监听器,但是这样性能开销就会非常大了,修改obj里面任何一个属性都会触发这个监听器里的 handler。

2.immediate

在选项参数中指定immediate: true 将立即以表达式的当前值触发handler回调函数。

### Vue2 中常用组件封装方法 #### 高阶组件 (HOC) 高阶组件是一种高级模式,在不修改原始组件的情况下扩展其功能。通过创建一个新的组件来包裹现有组件,可以向其中注入额外的功能逻辑。 ```javascript // HOC.js import Vue from 'vue'; export function withLoading(Component) { return Vue.extend({ name: "WithLoading", template: ` <div> <component :is="Component" v-if="!loading"></component> <div v-else>Loading...</div> </div>`, data() { return { loading: true, }; }, mounted() { setTimeout(() => this.loading = false, 1000); } }); } ``` 此代码展示了如何定义一个名为 `withLoading` 的高阶组件[^1]。该组件接收另一个组件作为参数并返回新的增强版组件实例。 #### 使用 `<slot>` 插槽实现可复用的基础组件 插槽允许父级模板中的任何标记都传入到子组件中,从而使得基础组件更加灵活多变。 ```html <!-- BaseButton.vue --> <template> <button @click="$emit('click')"> <slot></slot> </button> </template> <script> export default {}; </script> ``` 上述例子展示了一个简单的按钮组件,它可以通过默认插槽接受来自父组件的内容传递[^2]。 #### 表单控件与双向绑定 对于表单项而言,通常会涉及到v-model指令的应用,这需要确保内部状态能够响应外部变化的同时也能触发更新事件给外界监听者。 ```html <!-- InputField.vue --> <template> <input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" /> </template> <script> export default { props: ['modelValue'], }; </script> ``` 这段代码片段实现了自定义输入框组件支持v-model语法糖特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值