saulVModel.ts 580 B

1234567891011121314151617181920212223
  1. import { computed } from 'vue'
  2. export const saulVModel = <T extends Readonly<{ [k: string]: any }>, K extends keyof T>(
  3. props: T,
  4. propName: K,
  5. emit: (...args: any[]) => void
  6. ) => {
  7. return computed({
  8. get() {
  9. if (typeof props[propName] === 'object') {
  10. return new Proxy(props[propName], {
  11. set(obj, name, val) {
  12. emit(`update:${String(propName)}`, { ...obj, [name]: val })
  13. return true
  14. }
  15. })
  16. }
  17. return props[propName]
  18. },
  19. set(val) {
  20. emit(`update:${String(propName)}`, val)
  21. }
  22. })
  23. }