Repository: Tencent/tdesign-mobile-vue (ts)

Issue:
[Toast] preventScrollThrough属性无效
### tdesign-mobile-vue 版本

1.0.0-rc

### 重现链接

https://stackblitz.com/edit/ciheyf?file=src%2Fdemo.vue

### 重现步骤

1. 点击按钮
2. 上下滑动屏幕

### 期望结果

不能滑动

### 实际结果

可以上下滑动

### 框架版本

_No response_

### 浏览器版本

_No response_

### 系统版本

_No response_

### Node版本

_No response_

### 补充说明

_No response_

Pull request description:
fix(toast): 修复preventScrollThrough属性无效
fix #919

<!--
首先，感谢你的贡献！😄
请阅读并遵循 [TDesign 贡献指南](https://github.com/Tencent/tdesign/blob/main/docs/contributing.md)，填写以下 pull request 的信息。
PR 在维护者审核通过后会合并，谢谢！
-->

### 🤔 这个 PR 的性质是？

- [x] 日常 bug 修复
- [ ] 新特性提交
- [ ] 文档改进
- [ ] 演示代码改进
- [ ] 组件样式/交互改进
- [ ] CI/CD 改进
- [ ] 重构
- [ ] 代码风格优化
- [x] 测试用例
- [ ] 分支合并
- [ ] 其他

### 🔗 相关 Issue

<!--
1. 描述相关需求的来源，如相关的 issue 讨论链接。
-->

### 💡 需求背景和解决方案

<!--
1. 要解决的具体问题。
2. 列出最终的 API 实现和用法。
3. 涉及UI/交互变动需要有截图或 GIF。
-->

### 📝 更新日志

<!--
从用户角度描述具体变化，以及可能的 breaking change 和其他风险。
-->

fix(toast): 修复preventScrollThrough属性无效

- [ ] 本条 PR 不需要纳入 Changelog

### ☑️ 请求合并前的自查清单

⚠️ 请自检并全部**勾选全部选项**。⚠️

- [x] 文档已补充或无须补充
- [x] 代码演示已提供或无须提供
- [x] TypeScript 定义已补充或无须补充
- [x] Changelog 已提供或无须提供


Patch:
diff --git a/src/table/base-table.vue b/src/table/base-table.vue
index 9ce3d50e..1d3beaa5 100644
--- a/src/table/base-table.vue
+++ b/src/table/base-table.vue
@@ -103,7 +103,7 @@ export default defineComponent({
   setup(props) {
     const { classPrefix, tableLayoutClasses, tableHeaderClasses, tableBaseClass, tdAlignClasses, tdEllipsisClass } =
       useClassName();
-
+    const defaultLoadingContent = h(TLoading, { ...props.loadingProps });
     // 表格基础样式类
     const { tableClasses, tableContentStyles, tableElementStyles } = useStyle(props);
 
@@ -140,9 +140,8 @@ export default defineComponent({
     const renderCellEmptyContent = computed(() => renderTNode(internalInstance, 'cellEmptyContent'));
     const loadingClasses = computed(() => [`${classPrefix}-table__loading--full`]);
     const loadingContent = computed(() =>
-      renderTNode(internalInstance, 'loading', { defaultNode: h(TLoading, { ...props.loadingProps }) }),
+      renderTNode(internalInstance, 'loading', { defaultNode: defaultLoadingContent }),
     );
-
     const onInnerVirtualScroll = (e: WheelEvent) => {
       props.onScroll?.({ params: e });
     };
diff --git a/src/toast/toast.vue b/src/toast/toast.vue
index fa3fc93b..1c54ca80 100644
--- a/src/toast/toast.vue
+++ b/src/toast/toast.vue
@@ -14,7 +14,7 @@
 
 <script lang="ts">
 import { LoadingIcon, CheckCircleIcon, CloseCircleIcon } from 'tdesign-icons-vue-next';
-import { computed, toRefs, ref, defineComponent, getCurrentInstance, h } from 'vue';
+import { computed, toRefs, ref, defineComponent, getCurrentInstance, h, onUnmounted } from 'vue';
 import { renderTNode, TNode } from '../shared';
 import TOverlay from '../overlay';
 import ToastProps from './props';
@@ -22,6 +22,7 @@ import config from '../config';
 
 const { prefix } = config;
 const name = `${prefix}-toast`;
+const bodyLockClass = `${prefix}-overflow-hidden`;
 
 export default defineComponent({
   name,
@@ -70,18 +71,30 @@ export default defineComponent({
       },
     ]);
 
+    const lock = () => {
+      document.body.classList.add(bodyLockClass);
+    };
+
+    const unlock = () => {
+      document.body.classList.remove(bodyLockClass);
+    };
+
     const customOverlayProps = computed(() => {
       const toastOverlayProps = {
         preventScrollThrough: props.preventScrollThrough,
         visible: props.showOverlay,
       };
-
+      props.preventScrollThrough ? lock() : unlock();
       return {
         ...props.overlayProps,
         ...toastOverlayProps,
       };
     });
 
+    onUnmounted(() => {
+      unlock();
+    });
+
     return {
       name: ref(name),
       classes,


Test patch:
diff --git a/src/toast/__test__/index.test.jsx b/src/toast/__test__/index.test.jsx
index a826f5d3..d4e9f15b 100644
--- a/src/toast/__test__/index.test.jsx
+++ b/src/toast/__test__/index.test.jsx
@@ -4,6 +4,10 @@ import Overlay from '../../overlay';
 import { mount } from '@vue/test-utils';
 import { LoadingIcon } from 'tdesign-icons-vue-next';
 
+import config from '../../config';
+const { prefix } = config;
+const bodyLockClass = `${prefix}-overflow-hidden`;
+
 describe('Toast', () => {
   describe('props', () => {
     it(': direction', async () => {
@@ -56,6 +60,15 @@ describe('Toast', () => {
       expect(wrapper.findComponent(Overlay).vm.duration).toEqual(1000);
     });
 
+    it(': preventScrollThrough', async () => {
+      mount(Toast, {
+        props: {
+          preventScrollThrough: true,
+        },
+      });
+      expect(document.body.classList.contains(bodyLockClass)).toBeTruthy();
+    });
+
     it(': showOverlay', async () => {
       const wrapper = mount(Toast, {
         props: {