vue3+element-plus 项目中 el-switch 刷新后自动触发change

一、遇到的问题

       Vue3 + Element  Plus 的后台管理中使用 el-switch 控制状态,

<el-switch
  v-model="scope.row.status"
  active-value="0"
  inactive-value="1"
  @change="handleStatusChange(scope.row)"
></el-switch>

      以为 @change 只会在手动切换时触发,但是页面一刷新就执行  handleStatusChange ,使接   口被请求。


二、核心问题原因

  1. 初始值与组件配置值不匹配
    若组件的  active-value/inactive-value 与传入的 v-model 初始值不一致,组件初始化时会因状态变更自动触发 @change 事件。

  2. Element Plus 官方设计机制
    官方将 el-switch 的首次状态渲染视为一次“有效变更”,导致页面加载或刷新时自动触发 @change 事件。


三、高效解决方案 

方案 1:确保初始值与组件配置值一致
  • 检查 v-model 绑定的初始值是否严格等于 active-value 或 inactive-value

    <el-switch
      v-model="scope.row.status"
      :active-value="0"
      :inactive-value="1"
      @change="handleStatusChange(scope.row)"
    ></el-switch>
    

    加上 绑定,使 active-value 和 inactive-value 变成真正的数字类型,问题就解决了。

    // 初始化时确保 status 值为 0 或 1
    const status = ref(0);  // 或 1
    

       若数据源来自接口,需在赋值前进行类型和值校验。

方案 2:通过 v-if 延迟渲染组件
  • 在数据完成初始化后渲染组件,避免初始值不匹配:

    <el-switch 
      v-if="isDataReady"
      v-model="scope.row.status"
      :active-value="0"
      :inactive-value="1"
      @change="handleStatusChange(scope.row)"
    />
    
    const isDataReady = ref(false);
    onMounted(async () => {
      await fetchData();  // 获取数据
      isDataReady.value = true;
    });
    

    此方法可规避初始化时的意外触发。

方案 3:拦截首次自动触发
  • 通过标志变量过滤首次触发事件:

    let isFirstTrigger = true;
    const handleStatusChange = () => {
      if (isFirstTrigger) {
        isFirstTrigger = false;
        return;
      }
      // 正常业务逻辑
    };
    

    此逻辑需结合 @change 事件绑定使用。 


通过上述方案,可针对性解决 el-switch 自动触发事件的问题,同时保持代码简洁性和可维护性。 

### 实现 Vue3 Element Plus `el-tab-pane` 切换标签页时刷新页面数据 为了实现当用户点击不同的 `el-tab-pane` 时能够触发页面数据的重新加载,可以通过监听 `tab-change` 或者自定义事件来达到目的。具体方法如下: #### 使用 `@tab-click` 事件处理函数 在模板部分绑定 `@tab-click="handleTabChange"` 来响应用户的交互操作。 ```html <template> <div class="tabs-container"> <el-tabs v-model="activeName" @tab-click="handleTabChange"> <!-- 动态渲染多个 tab pane --> <el-tab-pane :key="pane.name" v-for="(pane, index) in panes" :label="pane.label" :name="pane.name"> {{ pane.content }} </el-tab-pane> </el-tabs> </div> </template> <script lang="ts"> import { ref, onMounted } from &#39;vue&#39;; export default { setup() { const activeName = ref(&#39;first&#39;); let panes = [ { label: "First", name: "first", content: "" }, { label: "Second", name: "second", content: "" } ]; function handleTabChange(tab: any) { console.log(`Selected Tab Name is ${tab.paneName}`); // 获取当前选中的标签名称[^2] fetchDataBasedOnActivePane(); } async function fetchDataBasedOnActivePane(){ try{ switch(activeName.value){ case &#39;first&#39;: // Fetch data specific to first tab and update state accordingly. break; case &#39;second&#39;: // Similar logic as above but tailored for second tab&#39;s requirements. break; default: throw new Error("Unexpected tab selected"); } }catch(error){ console.error("Failed fetching data:", error); } } return { activeName, panes, handleTabChange }; } }; </script> ``` 此代码片段展示了如何利用 TypeScript 和 Composition API 结合的方式去构建一个动态更新内容的功能。每当选择了新的标签页时就会调用 `fetchDataBasedOnActivePane()` 函数执行相应的异步请求并更新视图状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值