mixin.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. module.exports = {
  2. data() {
  3. return {}
  4. },
  5. onLoad() {
  6. // getRect挂载再$t上,用为这个方法需要使用in(this),所以无法把它独立层一个单独的文件导出
  7. this.$t.getRect = this._tGetRect
  8. },
  9. beforeDestory() {
  10. // 判断当前页面是否存在parent和children
  11. // 组件销毁时,移除子组件在父组件children数组中的实例,释放资源,避免数据混乱
  12. if (this.parent && uni.$t.test.array(this.parent.children)) {
  13. // 组件销毁时,移除子组件在父组件children数组中的实例
  14. const childrenList = this.parent.children
  15. childrenList.map((child, index) => {
  16. // 如果相对,则移除
  17. if (child === this) {
  18. childrenList.splice(index, 1)
  19. }
  20. })
  21. }
  22. },
  23. methods: {
  24. /**
  25. * 查询节点信息
  26. * 当前方法在支付宝小程序中无法获取组件跟接点的尺寸
  27. * 解决办法:为组件根部再套一个没有任何作用的view元素
  28. */
  29. _tGetRect(selector, all) {
  30. return new Promise((resolve) => {
  31. uni.createSelectorQuery()
  32. .in(this)[all ? 'selectAll' : 'select'](selector)
  33. .boundingClientRect(rect => {
  34. if (all && Array.isArray(rect) && rect.length) {
  35. resolve(rect)
  36. }
  37. if (!all && rect) {
  38. resolve(rect)
  39. }
  40. })
  41. .exec()
  42. })
  43. },
  44. /**
  45. * 获取父组件的数据
  46. */
  47. getParentData(parentName = '') {
  48. // 避免再created中定义parent变量
  49. if (!this.parent) this.parent = false
  50. // 通过获取父组件实例
  51. // 将父组件this中对应的参数,赋值给本组件的parentData对象中对应的属性
  52. // 头条小程序不支持通过this.parent.xxx去监听父组件参数的变化,所以需要本方法进行实现
  53. this.parent = this.$t.$parent.call(this, parentName)
  54. if (this.parent) {
  55. // 遍历parentData中的属性,将parent中同名的属性赋值给parentData
  56. Object.keys(this.parentData).map(key => {
  57. this.parentData[key] = this.parent[key]
  58. })
  59. }
  60. },
  61. /**
  62. * 阻止事件冒泡
  63. */
  64. preventEvent(e) {
  65. e && e.stopPropagation && e.stopPropagation()
  66. }
  67. }
  68. }