| 1 |
- {"remainingRequest":"D:\\front\\item\\zyAdmin\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\front\\item\\zyAdmin\\src\\pages\\product\\productAdd\\components\\virtualTabel.vue?vue&type=script&lang=js","dependencies":[{"path":"D:\\front\\item\\zyAdmin\\src\\pages\\product\\productAdd\\components\\virtualTabel.vue","mtime":1761614939048},{"path":"D:\\front\\item\\zyAdmin\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1761614927801},{"path":"D:\\front\\item\\zyAdmin\\node_modules\\babel-loader\\lib\\index.js","mtime":1761614927320},{"path":"D:\\front\\item\\zyAdmin\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1761614927801},{"path":"D:\\front\\item\\zyAdmin\\node_modules\\vue-loader\\lib\\index.js","mtime":1761614937402}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:DQppbXBvcnQgdGhyb3R0bGUgZnJvbSAnbG9kYXNoL3Rocm90dGxlJzsNCg0KZXhwb3J0IGRlZmF1bHQgew0KICBuYW1lOiAnZWwtdGFibGUtdmlydHVhbC1zY3JvbGwnLA0KICBwcm9wczogew0KICAgIGRhdGE6IHsNCiAgICAgIHR5cGU6IEFycmF5LA0KICAgICAgcmVxdWlyZWQ6IHRydWUsDQogICAgfSwNCiAgICBoZWlnaHQ6IHsNCiAgICAgIHR5cGU6IE51bWJlciwNCiAgICAgIGRlZmF1bHQ6IDYwLA0KICAgIH0sDQogICAgYnVmZmVyOiB7DQogICAgICB0eXBlOiBOdW1iZXIsDQogICAgICBkZWZhdWx0OiA1MDAsDQogICAgfSwNCiAgICBrZXlQcm9wOiB7DQogICAgICB0eXBlOiBTdHJpbmcsDQogICAgICBkZWZhdWx0OiAnaWQnLA0KICAgIH0sDQogICAgdGhyb3R0bGVUaW1lOiB7DQogICAgICB0eXBlOiBOdW1iZXIsDQogICAgICBkZWZhdWx0OiAxMDAsDQogICAgfSwNCiAgfSwNCiAgZGF0YSgpIHsNCiAgICByZXR1cm4gew0KICAgICAgc2l6ZXM6IHt9LCAvLyDlsLrlr7jmmKDlsITvvIjkvp3otZblk43lupTlvI/vvIkNCiAgICB9Ow0KICB9LA0KICBjb21wdXRlZDogew0KICAgIC8vIOiuoeeul+WHuuavj+S4qml0ZW3vvIjnmoRrZXnlgLzvvInliLDmu5rliqjlrrnlmajpobbpg6jnmoTot53nprsNCiAgICBvZmZzZXRNYXAoeyBrZXlQcm9wLCBoZWlnaHQsIHNpemVzLCBkYXRhIH0pIHsNCiAgICAgIGNvbnN0IHJlcyA9IHt9Ow0KICAgICAgbGV0IHRvdGFsID0gMDsNCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgew0KICAgICAgICBjb25zdCBrZXkgPSBkYXRhW2ldW2tleVByb3BdOw0KICAgICAgICByZXNba2V5XSA9IHRvdGFsOw0KDQogICAgICAgIGNvbnN0IGN1clNpemUgPSBzaXplc1trZXldOw0KICAgICAgICBjb25zdCBzaXplID0gdHlwZW9mIGN1clNpemUgPT09ICdudW1iZXInID8gY3VyU2l6ZSA6IGhlaWdodDsNCiAgICAgICAgdG90YWwgKz0gc2l6ZTsNCiAgICAgIH0NCiAgICAgIHJldHVybiByZXM7DQogICAgfSwNCiAgfSwNCiAgbWV0aG9kczogew0KICAgIC8vIOWIneWni+WMluaVsOaNrg0KICAgIGluaXREYXRhKCkgew0KICAgICAgLy8g5Y+v6KeG6IyD5Zu05YaF5pi+56S65pWw5o2uDQogICAgICB0aGlzLnJlbmRlckRhdGEgPSBbXTsNCiAgICAgIC8vIOmhtemdouWPr+inhuiMg+WbtOmhtuerr+OAgeW6lemDqA0KICAgICAgdGhpcy50b3AgPSB1bmRlZmluZWQ7DQogICAgICB0aGlzLmJvdHRvbSA9IHVuZGVmaW5lZDsNCiAgICAgIC8vIOaIquWPlumhtemdouWPr+inhuiMg+WbtOWGheaYvuekuuaVsOaNrueahOW8gOWni+WSjOe7k+Wwvue0ouW8lQ0KICAgICAgdGhpcy5zdGFydCA9IDA7DQogICAgICB0aGlzLmVuZCA9IHVuZGVmaW5lZDsNCg0KICAgICAgdGhpcy5zY3JvbGxlciA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5lbC10YWJsZV9fYm9keS13cmFwcGVyJyk7DQoNCiAgICAgIC8vIOWIneasoeaJp+ihjA0KICAgICAgc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgIHRoaXMuaGFuZGxlU2Nyb2xsKCk7DQogICAgICB9LCAxMDApOw0KDQogICAgICAvLyDnm5HlkKzkuovku7YNCiAgICAgIHRoaXMub25TY3JvbGwgPSB0aHJvdHRsZSh0aGlzLmhhbmRsZVNjcm9sbCwgdGhpcy50aHJvdHRsZVRpbWUpOw0KICAgICAgdGhpcy5zY3JvbGxlci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLmhhbmRsZVNjcm9sbCk7DQogICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5vblNjcm9sbCk7DQogICAgfSwNCg0KICAgIC8vIOabtOaWsOWwuuWvuO+8iOmrmOW6pu+8iQ0KICAgIHVwZGF0ZVNpemVzKCkgew0KICAgICAgY29uc3Qgcm93cyA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5lbC10YWJsZV9fYm9keSA+IHRib2R5ID4gLmVsLXRhYmxlX19yb3cnKTsNCg0KICAgICAgQXJyYXkuZnJvbShyb3dzKS5mb3JFYWNoKChyb3csIGluZGV4KSA9PiB7DQogICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnJlbmRlckRhdGFbaW5kZXhdOw0KICAgICAgICBpZiAoIWl0ZW0pIHJldHVybjsNCg0KICAgICAgICBjb25zdCBrZXkgPSBpdGVtW3RoaXMua2V5UHJvcF07DQogICAgICAgIGNvbnN0IG9mZnNldEhlaWdodCA9IHJvdy5vZmZzZXRIZWlnaHQ7DQoNCiAgICAgICAgaWYgKHRoaXMuc2l6ZXNba2V5XSAhPT0gb2Zmc2V0SGVpZ2h0KSB7DQogICAgICAgICAgdGhpcy4kc2V0KHRoaXMuc2l6ZXMsIGtleSwgb2Zmc2V0SGVpZ2h0KTsNCiAgICAgICAgfQ0KICAgICAgfSk7DQogICAgfSwNCg0KICAgIC8vIOWkhOeQhua7muWKqOS6i+S7tg0KICAgIGhhbmRsZVNjcm9sbChzaG91bGRVcGRhdGUgPSB0cnVlKSB7DQogICAgICAvLyDmm7TmlrDlvZPliY3lsLrlr7jvvIjpq5jluqbvvIkNCiAgICAgIHRoaXMudXBkYXRlU2l6ZXMoKTsNCiAgICAgIC8vIOiuoeeul3JlbmRlckRhdGENCiAgICAgIHRoaXMuY2FsY1JlbmRlckRhdGEoKTsNCiAgICAgIC8vIOiuoeeul+S9jee9rg0KICAgICAgdGhpcy5jYWxjUG9zaXRpb24oKTsNCiAgICAgIHNob3VsZFVwZGF0ZSAmJiB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7DQogICAgICAvLyDop6blj5Hkuovku7YNCiAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHRoaXMucmVuZGVyRGF0YSwgdGhpcy5zdGFydCwgdGhpcy5lbmQpOw0KICAgIH0sDQoNCiAgICAvLyDojrflj5bmn5DmnaHmlbDmja5vZmZzZXRUb3ANCiAgICBnZXRPZmZzZXRUb3AoaW5kZXgpIHsNCiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmRhdGFbaW5kZXhdOw0KICAgICAgaWYgKGl0ZW0pIHsNCiAgICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0TWFwW2l0ZW1bdGhpcy5rZXlQcm9wXV0gfHwgMDsNCiAgICAgIH0NCiAgICAgIHJldHVybiAwOw0KICAgIH0sDQoNCiAgICAvLyDojrflj5bmn5DmnaHmlbDmja7nmoTlsLrlr7gNCiAgICBnZXRTaXplKGluZGV4KSB7DQogICAgICBjb25zdCBpdGVtID0gdGhpcy5kYXRhW2luZGV4XTsNCiAgICAgIGlmIChpdGVtKSB7DQogICAgICAgIGNvbnN0IGtleSA9IGl0ZW1bdGhpcy5rZXlQcm9wXTsNCiAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZXNba2V5XSB8fCB0aGlzLmhlaWdodDsNCiAgICAgIH0NCiAgICAgIHJldHVybiB0aGlzLmhlaWdodDsNCiAgICB9LA0KDQogICAgLy8g6K6h566X5Y+q5Zyo6KeG5Zu+5LiK5riy5p+T55qE5pWw5o2uDQogICAgY2FsY1JlbmRlckRhdGEoKSB7DQogICAgICBjb25zdCB7IHNjcm9sbGVyLCBkYXRhLCBidWZmZXIgfSA9IHRoaXM7DQogICAgICAvLyDorqHnrpflj6/op4bojIPlm7Tpobbpg6jjgIHlupXpg6gNCiAgICAgIGNvbnN0IHRvcCA9IHNjcm9sbGVyLnNjcm9sbFRvcCAtIGJ1ZmZlcjsNCiAgICAgIGNvbnN0IGJvdHRvbSA9IHNjcm9sbGVyLnNjcm9sbFRvcCArIHNjcm9sbGVyLm9mZnNldEhlaWdodCArIGJ1ZmZlcjsNCg0KICAgICAgLy8g5LqM5YiG5rOV6K6h566X5Y+v6KeG6IyD5Zu05YaF55qE5byA5aeL55qE56ys5LiA5Liq5YaF5a65DQogICAgICBsZXQgbCA9IDA7DQogICAgICBsZXQgciA9IGRhdGEubGVuZ3RoIC0gMTsNCiAgICAgIGxldCBtaWQgPSAwOw0KICAgICAgd2hpbGUgKGwgPD0gcikgew0KICAgICAgICBtaWQgPSBNYXRoLmZsb29yKChsICsgcikgLyAyKTsNCiAgICAgICAgY29uc3QgbWlkVmFsID0gdGhpcy5nZXRPZmZzZXRUb3AobWlkKTsNCiAgICAgICAgaWYgKG1pZFZhbCA8IHRvcCkgew0KICAgICAgICAgIGNvbnN0IG1pZE5leHRWYWwgPSB0aGlzLmdldE9mZnNldFRvcChtaWQgKyAxKTsNCiAgICAgICAgICBpZiAobWlkTmV4dFZhbCA+IHRvcCkgYnJlYWs7DQogICAgICAgICAgbCA9IG1pZCArIDE7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgciA9IG1pZCAtIDE7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgLy8g6K6h566X5riy5p+T5YaF5a6555qE5byA5aeL44CB57uT5p2f57Si5byVDQogICAgICBsZXQgc3RhcnQgPSBtaWQ7DQogICAgICBsZXQgZW5kID0gZGF0YS5sZW5ndGggLSAxOw0KICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0ICsgMTsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgY29uc3Qgb2Zmc2V0VG9wID0gdGhpcy5nZXRPZmZzZXRUb3AoaSk7DQogICAgICAgIGlmIChvZmZzZXRUb3AgPj0gYm90dG9tKSB7DQogICAgICAgICAgZW5kID0gaTsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICAvLyDlvIDlp4vntKLlvJXlp4vnu4jkv53mjIHlgbbmlbDvvIzlpoLmnpzkuLrlpYfmlbDvvIzliJnliqAx5L2/5YW25L+d5oyB5YG25pWw44CQ56Gu5L+d6KGo5qC86KGM55qE5YG25pWw5pWw5LiA6Ie077yM5LiN5Lya5a+86Ie05paR6ams57q55Lmx5bqP5pi+56S644CRDQogICAgICBpZiAoc3RhcnQgJSAyKSB7DQogICAgICAgIHN0YXJ0ID0gc3RhcnQgLSAxOw0KICAgICAgfQ0KICAgICAgLy8gY29uc29sZS5sb2coc3RhcnQsIGVuZCwgJ3N0YXJ0IGVuZCcpDQoNCiAgICAgIHRoaXMudG9wID0gdG9wOw0KICAgICAgdGhpcy5ib3R0b20gPSBib3R0b207DQogICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7DQogICAgICB0aGlzLmVuZCA9IGVuZDsNCiAgICAgIHRoaXMucmVuZGVyRGF0YSA9IGRhdGEuc2xpY2Uoc3RhcnQsIGVuZCArIDEpOw0KICAgIH0sDQoNCiAgICAvLyDorqHnrpfkvY3nva4NCiAgICBjYWxjUG9zaXRpb24oKSB7DQogICAgICBjb25zdCBsYXN0ID0gdGhpcy5kYXRhLmxlbmd0aCAtIDE7DQogICAgICAvLyDorqHnrpflhoXlrrnmgLvpq5jluqYNCiAgICAgIGNvbnN0IHdyYXBIZWlnaHQgPSB0aGlzLmdldE9mZnNldFRvcChsYXN0KSArIHRoaXMuZ2V0U2l6ZShsYXN0KTsNCiAgICAgIC8vIOiuoeeul+W9k+WJjea7muWKqOS9jee9rumcgOimgeaSkei1t+eahOmrmOW6pg0KICAgICAgY29uc3Qgb2Zmc2V0VG9wID0gdGhpcy5nZXRPZmZzZXRUb3AodGhpcy5zdGFydCk7DQoNCiAgICAgIC8vIOiuvue9rmRvbeS9jee9rg0KICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IFsNCiAgICAgICAgJy5lbC10YWJsZV9fYm9keS13cmFwcGVyJywNCiAgICAgICAgJy5lbC10YWJsZV9fZml4ZWQtcmlnaHQgLmVsLXRhYmxlX19maXhlZC1ib2R5LXdyYXBwZXInLA0KICAgICAgICAnLmVsLXRhYmxlX19maXhlZCAuZWwtdGFibGVfX2ZpeGVkLWJvZHktd3JhcHBlcicsDQogICAgICBdOw0KICAgICAgY2xhc3NOYW1lcy5mb3JFYWNoKChjbGFzc05hbWUpID0+IHsNCiAgICAgICAgY29uc3QgZWwgPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKGNsYXNzTmFtZSk7DQogICAgICAgIGlmICghZWwpIHJldHVybjsNCg0KICAgICAgICAvLyDliJvlu7p3cmFwRWzjgIFpbm5lckVsDQogICAgICAgIGlmICghZWwud3JhcEVsKSB7DQogICAgICAgICAgY29uc3Qgd3JhcEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogICAgICAgICAgY29uc3QgaW5uZXJFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgICAgICAgIHdyYXBFbC5hcHBlbmRDaGlsZChpbm5lckVsKTsNCiAgICAgICAgICBpbm5lckVsLmFwcGVuZENoaWxkKGVsLmNoaWxkcmVuWzBdKTsNCiAgICAgICAgICBlbC5pbnNlcnRCZWZvcmUod3JhcEVsLCBlbC5maXJzdENoaWxkKTsNCiAgICAgICAgICBlbC53cmFwRWwgPSB3cmFwRWw7DQogICAgICAgICAgZWwuaW5uZXJFbCA9IGlubmVyRWw7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZWwud3JhcEVsKSB7DQogICAgICAgICAgLy8g6K6+572u6auY5bqmDQogICAgICAgICAgZWwud3JhcEVsLnN0eWxlLmhlaWdodCA9IHdyYXBIZWlnaHQgKyAncHgnOw0KICAgICAgICAgIC8vIOiuvue9rnRyYW5zZm9ybeaSkei1t+mrmOW6pg0KICAgICAgICAgIGVsLmlubmVyRWwuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHtvZmZzZXRUb3B9cHgpYDsNCiAgICAgICAgICAvLyDorr7nva5wYWRkaW5nVG9w5pKR6LW36auY5bqmDQogICAgICAgICAgLy8gZWwuaW5uZXJFbC5zdHlsZS5wYWRkaW5nVG9wID0gYCR7b2Zmc2V0VG9wfXB4YA0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9LA0KDQogICAgLy8g56m66Zey5pe25pu05paw5L2N572uDQogICAgdXBkYXRlUG9zaXRpb24oKSB7DQogICAgICB0aGlzLnRpbWVyICYmIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTsNCiAgICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgdGhpcy50aW1lciAmJiBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7DQogICAgICAgIC8vIOS8oOWFpWZhbHNl77yM6YG/5YWN5LiA55u05b6q546v6LCD55SoDQogICAgICAgIHRoaXMuaGFuZGxlU2Nyb2xsKGZhbHNlKTsNCiAgICAgIH0sIHRoaXMudGhyb3R0bGVUaW1lICsgMTApOw0KICAgIH0sDQoNCiAgICAvLyDjgJDlpJbpg6josIPnlKjjgJHmm7TmlrANCiAgICB1cGRhdGUoKSB7DQogICAgICB0aGlzLmhhbmRsZVNjcm9sbCgpOw0KICAgIH0sDQoNCiAgICAvLyDjgJDlpJbpg6josIPnlKjjgJHmu5rliqjliLDnrKzlh6DooYwNCiAgICBzY3JvbGxUbyhpbmRleCwgc3RvcCA9IGZhbHNlKSB7DQogICAgICBjb25zdCBpdGVtID0gdGhpcy5kYXRhW2luZGV4XTsNCiAgICAgIGlmIChpdGVtICYmIHRoaXMuc2Nyb2xsZXIpIHsNCiAgICAgICAgdGhpcy51cGRhdGVTaXplcygpOw0KICAgICAgICB0aGlzLmNhbGNSZW5kZXJEYXRhKCk7DQoNCiAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gew0KICAgICAgICAgIGNvbnN0IG9mZnNldFRvcCA9IHRoaXMuZ2V0T2Zmc2V0VG9wKGluZGV4KTsNCiAgICAgICAgICB0aGlzLnNjcm9sbGVyLnNjcm9sbFRvcCA9IG9mZnNldFRvcDsNCg0KICAgICAgICAgIC8vIOiwg+eUqOS4pOasoXNjcm9sbFRv77yM56ys5LiA5qyh5rua5Yqo5pe277yM5aaC5p6c6KGo5qC86KGM5Yid5qyh5riy5p+T6auY5bqm5Y+R55Sf5Y+Y5YyW5pe277yM5Lya5a+86Ie05rua5Yqo5L2N572u5pyJ5YGP5beu77yM5q2k5pe26ZyA6KaB56ys5LqM5qyh5omn6KGM5rua5Yqo77yM56Gu5L+d5rua5Yqo5L2N572u5peg6K+vDQogICAgICAgICAgaWYgKCFzdG9wKSB7DQogICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUbyhpbmRleCwgdHJ1ZSk7DQogICAgICAgICAgICB9LCA1MCk7DQogICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgIH0NCiAgICB9LA0KDQogICAgLy8g44CQ5aSW6YOo6LCD55So44CR6YeN572uDQogICAgcmVzZXQoKSB7DQogICAgICB0aGlzLnNpemVzID0ge307DQogICAgICB0aGlzLnNjcm9sbFRvKDAsIGZhbHNlKTsNCiAgICB9LA0KICB9LA0KICB3YXRjaDogew0KICAgIGRhdGEoKSB7DQogICAgICB0aGlzLnVwZGF0ZSgpOw0KICAgIH0sDQogIH0sDQogIGNyZWF0ZWQoKSB7DQogICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gew0KICAgICAgdGhpcy5pbml0RGF0YSgpOw0KICAgIH0pOw0KICB9LA0KICBiZWZvcmVEZXN0cm95KCkgew0KICAgIGlmICh0aGlzLnNjcm9sbGVyKSB7DQogICAgICB0aGlzLnNjcm9sbGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMub25TY3JvbGwpOw0KICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25TY3JvbGwpOw0KICAgIH0NCiAgfSwNCn07DQo="},{"version":3,"sources":["virtualTabel.vue"],"names":[],"mappings":";AAOA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"virtualTabel.vue","sourceRoot":"src/pages/product/productAdd/components","sourcesContent":["<template>\r\n <div>\r\n <slot></slot>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport throttle from 'lodash/throttle';\r\n\r\nexport default {\r\n name: 'el-table-virtual-scroll',\r\n props: {\r\n data: {\r\n type: Array,\r\n required: true,\r\n },\r\n height: {\r\n type: Number,\r\n default: 60,\r\n },\r\n buffer: {\r\n type: Number,\r\n default: 500,\r\n },\r\n keyProp: {\r\n type: String,\r\n default: 'id',\r\n },\r\n throttleTime: {\r\n type: Number,\r\n default: 100,\r\n },\r\n },\r\n data() {\r\n return {\r\n sizes: {}, // 尺寸映射(依赖响应式)\r\n };\r\n },\r\n computed: {\r\n // 计算出每个item(的key值)到滚动容器顶部的距离\r\n offsetMap({ keyProp, height, sizes, data }) {\r\n const res = {};\r\n let total = 0;\r\n for (let i = 0; i < data.length; i++) {\r\n const key = data[i][keyProp];\r\n res[key] = total;\r\n\r\n const curSize = sizes[key];\r\n const size = typeof curSize === 'number' ? curSize : height;\r\n total += size;\r\n }\r\n return res;\r\n },\r\n },\r\n methods: {\r\n // 初始化数据\r\n initData() {\r\n // 可视范围内显示数据\r\n this.renderData = [];\r\n // 页面可视范围顶端、底部\r\n this.top = undefined;\r\n this.bottom = undefined;\r\n // 截取页面可视范围内显示数据的开始和结尾索引\r\n this.start = 0;\r\n this.end = undefined;\r\n\r\n this.scroller = this.$el.querySelector('.el-table__body-wrapper');\r\n\r\n // 初次执行\r\n setTimeout(() => {\r\n this.handleScroll();\r\n }, 100);\r\n\r\n // 监听事件\r\n this.onScroll = throttle(this.handleScroll, this.throttleTime);\r\n this.scroller.addEventListener('scroll', this.handleScroll);\r\n window.addEventListener('resize', this.onScroll);\r\n },\r\n\r\n // 更新尺寸(高度)\r\n updateSizes() {\r\n const rows = this.$el.querySelectorAll('.el-table__body > tbody > .el-table__row');\r\n\r\n Array.from(rows).forEach((row, index) => {\r\n const item = this.renderData[index];\r\n if (!item) return;\r\n\r\n const key = item[this.keyProp];\r\n const offsetHeight = row.offsetHeight;\r\n\r\n if (this.sizes[key] !== offsetHeight) {\r\n this.$set(this.sizes, key, offsetHeight);\r\n }\r\n });\r\n },\r\n\r\n // 处理滚动事件\r\n handleScroll(shouldUpdate = true) {\r\n // 更新当前尺寸(高度)\r\n this.updateSizes();\r\n // 计算renderData\r\n this.calcRenderData();\r\n // 计算位置\r\n this.calcPosition();\r\n shouldUpdate && this.updatePosition();\r\n // 触发事件\r\n this.$emit('change', this.renderData, this.start, this.end);\r\n },\r\n\r\n // 获取某条数据offsetTop\r\n getOffsetTop(index) {\r\n const item = this.data[index];\r\n if (item) {\r\n return this.offsetMap[item[this.keyProp]] || 0;\r\n }\r\n return 0;\r\n },\r\n\r\n // 获取某条数据的尺寸\r\n getSize(index) {\r\n const item = this.data[index];\r\n if (item) {\r\n const key = item[this.keyProp];\r\n return this.sizes[key] || this.height;\r\n }\r\n return this.height;\r\n },\r\n\r\n // 计算只在视图上渲染的数据\r\n calcRenderData() {\r\n const { scroller, data, buffer } = this;\r\n // 计算可视范围顶部、底部\r\n const top = scroller.scrollTop - buffer;\r\n const bottom = scroller.scrollTop + scroller.offsetHeight + buffer;\r\n\r\n // 二分法计算可视范围内的开始的第一个内容\r\n let l = 0;\r\n let r = data.length - 1;\r\n let mid = 0;\r\n while (l <= r) {\r\n mid = Math.floor((l + r) / 2);\r\n const midVal = this.getOffsetTop(mid);\r\n if (midVal < top) {\r\n const midNextVal = this.getOffsetTop(mid + 1);\r\n if (midNextVal > top) break;\r\n l = mid + 1;\r\n } else {\r\n r = mid - 1;\r\n }\r\n }\r\n\r\n // 计算渲染内容的开始、结束索引\r\n let start = mid;\r\n let end = data.length - 1;\r\n for (let i = start + 1; i < data.length; i++) {\r\n const offsetTop = this.getOffsetTop(i);\r\n if (offsetTop >= bottom) {\r\n end = i;\r\n break;\r\n }\r\n }\r\n\r\n // 开始索引始终保持偶数,如果为奇数,则加1使其保持偶数【确保表格行的偶数数一致,不会导致斑马纹乱序显示】\r\n if (start % 2) {\r\n start = start - 1;\r\n }\r\n // console.log(start, end, 'start end')\r\n\r\n this.top = top;\r\n this.bottom = bottom;\r\n this.start = start;\r\n this.end = end;\r\n this.renderData = data.slice(start, end + 1);\r\n },\r\n\r\n // 计算位置\r\n calcPosition() {\r\n const last = this.data.length - 1;\r\n // 计算内容总高度\r\n const wrapHeight = this.getOffsetTop(last) + this.getSize(last);\r\n // 计算当前滚动位置需要撑起的高度\r\n const offsetTop = this.getOffsetTop(this.start);\r\n\r\n // 设置dom位置\r\n const classNames = [\r\n '.el-table__body-wrapper',\r\n '.el-table__fixed-right .el-table__fixed-body-wrapper',\r\n '.el-table__fixed .el-table__fixed-body-wrapper',\r\n ];\r\n classNames.forEach((className) => {\r\n const el = this.$el.querySelector(className);\r\n if (!el) return;\r\n\r\n // 创建wrapEl、innerEl\r\n if (!el.wrapEl) {\r\n const wrapEl = document.createElement('div');\r\n const innerEl = document.createElement('div');\r\n wrapEl.appendChild(innerEl);\r\n innerEl.appendChild(el.children[0]);\r\n el.insertBefore(wrapEl, el.firstChild);\r\n el.wrapEl = wrapEl;\r\n el.innerEl = innerEl;\r\n }\r\n\r\n if (el.wrapEl) {\r\n // 设置高度\r\n el.wrapEl.style.height = wrapHeight + 'px';\r\n // 设置transform撑起高度\r\n el.innerEl.style.transform = `translateY(${offsetTop}px)`;\r\n // 设置paddingTop撑起高度\r\n // el.innerEl.style.paddingTop = `${offsetTop}px`\r\n }\r\n });\r\n },\r\n\r\n // 空闲时更新位置\r\n updatePosition() {\r\n this.timer && clearTimeout(this.timer);\r\n this.timer = setTimeout(() => {\r\n this.timer && clearTimeout(this.timer);\r\n // 传入false,避免一直循环调用\r\n this.handleScroll(false);\r\n }, this.throttleTime + 10);\r\n },\r\n\r\n // 【外部调用】更新\r\n update() {\r\n this.handleScroll();\r\n },\r\n\r\n // 【外部调用】滚动到第几行\r\n scrollTo(index, stop = false) {\r\n const item = this.data[index];\r\n if (item && this.scroller) {\r\n this.updateSizes();\r\n this.calcRenderData();\r\n\r\n this.$nextTick(() => {\r\n const offsetTop = this.getOffsetTop(index);\r\n this.scroller.scrollTop = offsetTop;\r\n\r\n // 调用两次scrollTo,第一次滚动时,如果表格行初次渲染高度发生变化时,会导致滚动位置有偏差,此时需要第二次执行滚动,确保滚动位置无误\r\n if (!stop) {\r\n setTimeout(() => {\r\n this.scrollTo(index, true);\r\n }, 50);\r\n }\r\n });\r\n }\r\n },\r\n\r\n // 【外部调用】重置\r\n reset() {\r\n this.sizes = {};\r\n this.scrollTo(0, false);\r\n },\r\n },\r\n watch: {\r\n data() {\r\n this.update();\r\n },\r\n },\r\n created() {\r\n this.$nextTick(() => {\r\n this.initData();\r\n });\r\n },\r\n beforeDestroy() {\r\n if (this.scroller) {\r\n this.scroller.removeEventListener('scroll', this.onScroll);\r\n window.removeEventListener('resize', this.onScroll);\r\n }\r\n },\r\n};\r\n</script>\r\n\r\n<style lang=\"less\" scoped></style>\r\n"]}]}
|