几个典型的场景

  1. 表单 父子组件交互多
  2. 表格

antd-vue

radio,select

可以单独存在,也可以外面包裹 a-radio-group

  1. <a-radio v-model:checked="checked">Radio</a-radio>
  2. <a-radio-group v-model:value="value">
  3. <a-radio :style="radioStyle" :value="1">Option A</a-radio>
  4. <a-radio :style="radioStyle" :value="2">Option B</a-radio>
  5. </a-radio-group>

疑问是,父组件,1 怎么监听到子组件的变动,修改value 2 并重置另外一个select。

如点击A,则A选择中,并更新value,并且B从选中重置为未选中。

背后的实现, context ,父组件提供API,子组件通过调用父组件提供API,通知父组件,以及通过父组件属性获取父组件值。

radio

  1. // radio
  2. export default defineComponent({
  3. setup() {
  4. return {
  5. configProvider: inject('configProvider', defaultConfigProvider),
  6. radioGroupContext: inject('radioGroupContext', null),
  7. };
  8. },
  9. methods: {
  10. onChange2(e) {
  11. // ... 省略了一些判断
  12. this.radioGroupContext.onRadioChange(e) // 通知父组件变更
  13. }
  14. }
  15. render(){
  16. const props = getOptionProps(this);
  17. const rProps = {}
  18. if(radioGroupContext) {
  19. rProps.onChange = this.onChange2;
  20. rProps.checked = props.value === radioGroup.stateValue;
  21. }
  22. return <radio {...rProps} />
  23. }
  24. });

核心util getSlot

核心util