组件通信 
项目差不多做完,趁热打铁,总结一下
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