You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
1.7 KiB

3 years ago
  1. // 获取父组件的参数,因为支付宝小程序不支持provide/inject的写法
  2. // this.$parent在非H5中,可以准确获取到父组件,但是在H5中,需要多次this.$parent.$parent.xxx
  3. export default function getParent(name, keys) {
  4. let parent = this.$parent;
  5. // 通过while历遍,这里主要是为了H5需要多层解析的问题
  6. while (parent) {
  7. // 父组件
  8. if (parent.$options.name !== name) {
  9. // 如果组件的name不相等,继续上一级寻找
  10. parent = parent.$parent;
  11. } else {
  12. let data = {};
  13. // 判断keys是否数组,如果传过来的是一个数组,那么直接使用数组元素值当做键值去父组件寻找
  14. if(Array.isArray(keys)) {
  15. keys.map(val => {
  16. data[val] = parent[val] ? parent[val] : '';
  17. })
  18. } else {
  19. // 历遍传过来的对象参数
  20. for(let i in keys) {
  21. // 如果子组件有此值则用,无此值则用父组件的值
  22. // 判断是否空数组,如果是,则用父组件的值,否则用子组件的值
  23. if(Array.isArray(keys[i])) {
  24. if(keys[i].length) {
  25. data[i] = keys[i];
  26. } else {
  27. data[i] = parent[i];
  28. }
  29. } else if(keys[i].constructor === Object) {
  30. // 判断是否对象,如果是对象,且有属性,那么使用子组件的值,否则使用父组件的值
  31. if(Object.keys(keys[i]).length) {
  32. data[i] = keys[i];
  33. } else {
  34. data[i] = parent[i];
  35. }
  36. } else {
  37. // 只要子组件有传值,即使是false值,也是“传值”了,也需要覆盖父组件的同名参数
  38. data[i] = (keys[i] || keys[i] === false) ? keys[i] : parent[i];
  39. }
  40. }
  41. }
  42. return data;
  43. }
  44. }
  45. return {};
  46. }