//setup语法糖不可以使用beforeRouteEnter

本文详细描述了在Vue项目中如何使用模板和脚本处理路由跳转前的事件,以及如何通过组件间的交互实现工作面板中的按钮操作和路由切换。
摘要由CSDN通过智能技术生成

<!-- //setup语法糖不可以使用beforeRouteEnter,
所以要添加vue2的script来实现路由跳转前的事件处理。 -->
<!-- vue3中如果使用vue2的语法 也要使用vue2的方法 -->

<template>
    <!-- <span style="font-style:initial;font-size:12px;color: #303133;">我的工作</span> -->
    <!-- <el-button @click="onAddArticle">项目管理</el-button> -->
    <div class="worktable-header">
        <div class="worktable-header__left"><span class="worktable-header__title" style="">我的工作</span></div>
        <div class="worktable-header__right">
            <div class="worktable-tab-right">
                <div class="worktable-tab__group"><span class="group__label"><span class="label-icon tapd-icon-group-v2" style=""></span><span class="label-text">分组</span></span>
                    <ul class="tab-select">
                        <li class="tab-select__item "><span class="tab-select__item-label"><span class="tab-select__item-icon tapd-icon-space-v2"></span>空间</span></li>
                        <li class="tab-select__item"><span class="tab-select__item-label"><span class="tab-select__item-icon tapd-icon-clock-v2"></span>时间</span></li>
                        <li class="tab-select__item"><span class="tab-select__item-label"><span class="tab-select__item-icon tapd-icon-type-v2"></span>类别</span></li>
                    </ul>
                </div>
            </div>
        </div>
    </div>

    <el-row style="padding-top: 10px;
    border-bottom: 1px solid #e8e9ec;margin-bottom: 10px;padding-bottom: 10px; ">
        <!-- 添加工作按钮 -->
        <el-button style="padding: 0px 20px;"  @click="onAddWork"> 添加工作</el-button> 
        <span style="padding-right:10px;font-style:solid;font-size:20px;color: #303133;">|</span>

        <router-link to="/project/manage/mywork">
          <el-button ref="myWorkButtonRef" @click="toDo" round >待办</el-button>
        </router-link>
        <router-link to="/project/manage/mywork1">
          <el-button @click="Done" round>已办</el-button>
        </router-link>
        <router-link to="/project/manage/mywork2">
          <el-button round>已创建</el-button>
        </router-link>
        <router-link to="/project/manage/mywork">
        <el-button round>已加入</el-button>
        </router-link>
    </el-row>
    <router-view></router-view>  
    <AddWorkDraw  @success="onSuccess" ref="addWorkRef"></AddWorkDraw>
    <Drawer @success="onSuccess" ref="articleRef" />
</template>


<!-- //setup语法糖不可以使用beforeRouteEnter,因为setup语法糖会在组件渲染之前执行,
而beforeRouteEnter是在路由跳转前执行,所以会导致路由跳转失败。
所以要添加vue2的script来实现路由跳转前的事件处理。 -->
<!-- vue3中如果使用vue2的语法 也要使用vue2的方法 -->
<script lang="ts">
    // @ts-ignore
    import AddWorkDraw from '@/views/projectManage/mywork/components/addWork.vue'
    // @ts-ignore
    import { artDelService, GetArtList } from '@/api/article.js'
    // @ts-ignore
    import { formatTime } from '@/utils/format.js'
    import { nextTick, onMounted, ref, toRef, watch} from 'vue'
    import Drawer from '../../Drawer.vue'
    import { Delete, Edit } from '@element-plus/icons-vue'
    import router from '../../../router'
    import { onBeforeRouteLeave, onBeforeRouteUpdate} from 'vue-router'


   export default {
        data() {
            return {
            articleList: [],
            articleRef: null,
            clickState:ref(false)
            };
        },
        components: {
            AddWorkDraw,
            Drawer,
            Delete,
            Edit
        },

        // 路由进入之前this未定义
        // beforeRouteEnter(to, from, next) {
        //     console.log('beforeRouteEnter');
        //     this.refreshTheDefaultClickEvent();
        //     next();
        // },

        // beforeRouteLeave(to, from, next) {
        //         console.log('beforeRouteleave');
        //         this.refreshTheDefaultClickEvent();
        //         next();
        // },

        mounted() {
            console.log(this); 
            this.refreshTheDefaultClickEvent();
        },

        watch: {
            clickState(newValue, oldValue) {
                if (!newValue) {
                    // console.log('点击事件状态改变为:未点击',this.$refs.myWorkButtonRef.$el);
                    this.$refs.myWorkButtonRef.$el.style.removeProperty('background-color'); // 移除颜色样式
                }
            }
        },
        methods: {
            refreshTheDefaultClickEvent() {
                this.$nextTick(() => {
                    const dom = this.$refs.myWorkButtonRef.$el;
                    dom.click(); // 点击事件
                    dom.style.cssText = "background-color:#ecf5ff;"; // 改变颜色样式
                });
            },


            onAddWork() {
                this.clickState = !this.clickState;
                this.$refs.addWorkRef.open();
            },

            toDo() {
                this.clickState = !this.clickState;
            },
            Done() {
                this.clickState = !this.clickState;
            },
            onEditArticle(row) {
            this.articleRef.open(row);
            },
            onSuccess() {
            const res = GetArtList(); // 假设 GetArtList 是全局定义的获取文章列表的方法
            res.then((res) => {
                this.articleList = res.data.data;
            });
            }
        }
    };
</script> 


<!-- <script lang = 'ts' setup>
// @ts-ignore
import AddWorkDraw from '@/views/projectManage/mywork/components/addWork.vue'
// @ts-ignore
import { artDelService, GetArtList } from '@/api/article.js'
// @ts-ignore
import { formatTime } from '@/utils/format.js'
import { nextTick, onMounted, ref, toRef, watch} from 'vue'
import Drawer from '../../Drawer.vue'
import { Delete, Edit } from '@element-plus/icons-vue'
import router from '../../../router'
import { onBeforeRouteLeave, onBeforeRouteUpdate} from 'vue-router'

const articleList = ref([

])
const articleRef = ref()

const myWorkButtonRef = ref();

//获取路由实例router.currentRoute.value
//组件加载完成使用刷新页面默认点击方法
onMounted(() => {
    refreshTheDefaultClickEvent();
    // console.log('vm',router.currentRoute);
    
})


//刷新页面默认点击待办事件
const refreshTheDefaultClickEvent = () => {
    nextTick()
    const dom = myWorkButtonRef.value.$el
    dom.click() //点击事件
    dom.style.cssText = "background-color:#ecf5ff;" // 改变颜色样式
//  console.log('myWorkButtonRef.value.$el',myWorkButtonRef.value.$el);
}


//监听其他点击事件 取消刷新页面默认点击事件
const clickState = ref(false);
watch(clickState, (newValue, oldValue) => {
  //如果新的值为false,则执行点击事件
  if (!newValue) {
    console.log('点击事件状态改变为:未点击');
    myWorkButtonRef.value.$el.style.removeProperty('background-color'); // 移除颜色样式
  }
});

//绑定子组件dom对象
const addWorkRef = ref()
//调用addWorkRef组件的open方法打开抽屉
const onAddWork = () => {
  clickState.value = !clickState.value;
  addWorkRef.value.open()
}

const toDo = () => {
  clickState.value = !clickState.value;
    
}

const Done = () => {
  clickState.value = !clickState.value;

}


const onEditArticle = (row) => {
  articleRef.value.open(row)

}
const onSuccess = () => {
 
  const res = GetArtList()
  res.then((res) => {
      articleList.value = res.data.data
  })
}



// const onDeleteArticle = async (row) => {
//   await ElMessageBox.confirm('你确认删除该文章信息吗?', '温馨提示', {
//       type: 'warning',
//       confirmButtonText: '确认',
//       cancelButtonText: '取消'
//   })
//   console.log("row is", row);

//   await artDelService(row)
//   ElMessage({ type: 'success', message: '删除成功' })
//   const res = GetArtList()
//   res.then((res) => {
//       articleList.value = res.data.data
//   })
// }
</script> -->

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值