组件通信
项目差不多做完,趁热打铁,总结一下
props
props 父传子
events
直接把变量带进方法 @click="onClick(status)"
provide/inject
FormContext form => formItem
formItemContext FormItem => input
Scoped lost
FormItem #template
在父组件创建数据结构,在子组件填充数据(子到父也可)
- Form => FormItemContext[]
- 子组件FormItem => onMounted时插入数据(addField)、删除数据(removeField)
- 在Form(父组件) 直接调用 FormItem 的具体属性和方法
如:父组件创建变量 let instances = []
通过方法2 传实例,这样父组件就可以通过instances拿到实例,使用expose的方法和属性了
pub/sub 发布订阅模型
ts
// 父组件
const emitter = mitt()
emitter.on('addField', () => {})
emitter.on('removeField', () => {})
provide(key, { emitter })
// 子组件
emitter = inject(formContextKey)
emitter.emit(addField, formItemContext)
vuex(Piano)
这里暂用不到
其他Tip
- 注意defineExpose,一个好的组件应尽可能为用户提供实例中有用的信息
- vue3 新增expose(vue2实例属性都能拿到,杂且不安全)
- 对于有可能出现的异步操作,尽可能提供Promise