技术前端VueVue组件通信
吴华锦props
父传子组件的属性,props
值可以是一个数组或对象。
$emit
子传父组件绑定自定义事件。
1 2 3 4
| <home @title="title">
this.$emit('title',[{title:'这是title'}])
|
vuex
vuex
是一个状态管理器插件,适合数据共享多的项目。
state
:定义存储数据的仓库,可通过this.$store.state
或mapState
访问;
getters
:获取store
值,可认为是store
的计算属性,可通过this.$store.getters
或mapGetters
访问;
mutations
:同步改变store
值,为什么会设计成同步,因为mutation
是直接改变store
值,Vue
对操作进行了记录,如果是异步无法追踪改变,可通过mapMutations
调用;
actions
:异步调用函数执行mutation
,进而改变store
值,可通过this.$dispatch
或mapActions
访问;
modules
:模块,如果状态过多,可以拆分成模块,最后在入口通过...
解构引入。
parent父实例和children子实例
- 父组件
this.$children
- 子组件
this.$parent
children
和parent
并不保证顺序,也不是响应式,只能拿到一级父组件和子组件。
$refs
1 2 3 4 5 6
| <home ref="home"/>
mounted(){ }
|
$root
1 2 3 4 5 6
| mounted(){ console.log(this.$root) console.log(this.$root.$children[0]) console.log(this.$root.$children[0].$children[0]) }
|
.sync
1 2 3 4 5 6 7 8 9 10
| <home :title.sync="title" />
<home :title="title" @update:title="val => title = val"/>
mounted(){ this.$emit("update:title", '这是新的title') }
|
v-slot
v-slot
作用就是将父组件的template
传入子组件。
插槽分类:匿名插槽(默认插槽),没有命名,有且仅有一个。
1 2 3 4 5 6 7 8 9 10 11
| <todo-list> <template v-slot:default> 任意内容 <p>我是匿名插槽</p> </template> </todo-list>
<slot>我是默认值</slot>
|
具名插槽:相对匿名插槽组件slot
标签带name
命名。
1 2 3 4 5 6 7 8 9 10
| <todo-list> <template v-slot:todo> 任意内容 <p>我是匿名插槽</p> </template> </todo-list>
<slot name="todo">我是默认值</slot>
|
作用域插槽:子组件内数据可以被父页面拿到(解决了数据只能从父页面传递给子组件)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <todo-list> <template v-slot:todo="slotProps" > {{slotProps.user.firstName}} </template> </todo-list>
<slot name="todo" :user="user" :test="test"> {{ user.lastName }} </slot> data() { return { user:{ lastName:"Zhang", firstName:"san" }, test:[1,2,3,4] } },
|
EventBus
- 生命一个全局Vue实例变量
EventBus
,把所有的通信数据、事件监听都存储到这个变量上;
- 类似于Vuex,但这种方式只适用于极小的项目;
- 原理就是利用
on
和emit
,并实例化一个全局Vue实现数据共享;
- 可以实现平级、嵌套组件传值,但是对应的事件名
eventTarget
必须是全局唯一的。
1 2 3 4 5 6 7 8 9 10
| Vue.prototype.$eventBus=new Vue();
this.$eventBus.$emit('eventTarget','这是eventTarget传过来的值')
this.$eventBus.$on("eventTarget",v=>{ console.log('eventTarget',v); })
|
路由传参
- 方案一:
1 2 3 4 5 6 7 8 9 10 11 12
| { path: '/describe/:id', name: 'Describe', component: Describe }
this.$router.push({ path: `/describe/${id}`, })
this.$route.params.id
|
- 方案二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| { path: '/describe', name: 'Describe', omponent: Describe }
this.$router.push({ name: 'Describe', params: { id: id } })
this.$route.params.id
|
- 方案三:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| { path: '/describe', name: 'Describe', component: Describe }
this.$router.push({ path: '/describe', query: { id: id `} ) // 页面获取 this.$route.query.id
|
三种方案对比,方案二参数不会拼接在路由后面,页面刷新参数会丢失;方案一和三参数拼接在后面,暴露了信息。