vue全家桶-组件内部应用守卫简洁版-防止输入框未保存的数据丢失

首先是项目目录:

项目通过vue-router创建之后,添加了一些组件:User.vue Profile.vue Posts.vue Eaditor.vue。

组件相关的代码,在下面会一一列出来。

本文知识点涉及到三个组件:index.js Eaditor.vue App.vue。

总共4个步骤:

第一步:新建Eaditor.vue组件

Eaditor.vue代码如下:

// Eaditor.vue里面的内容

<template>
    <div>
        <h3>编辑页面</h3>
        <textarea v-model="content" cols="30" rows="10"></textarea>
        <button @click="saveContent">保存</button>
        <ul>
            <li v-for="(item,index) in list" :key="index">
                {{item.title}}
            </li>
        </ul>
    </div>
</template>

<script>
    export default {
        data(){
            return{
                content:'',
                list:[]
            }
        },
        methods:{
            saveContent(){
                this.list.push({
                    title:this.content
                })
                this.content = ''
            }
        },
        beforeRouteLeave(to,from,next){
            if(this.content){
                alert('请保存后再离开!');
                next(false);
            }else{
                next();
            }
        }

    }
</script>

<style lang="scss" scoped>

</style>

第二步:在index.js里面挂载Eaditor.vue

index.js代码如下:

// index.js里面的内容

import { createRouter, createWebHistory } from 'vue-router'
import Home from '../views/Home.vue'
// import Posts from '@/views/Posts.vue'

const routes = [
  {
    path: '/',
    name: 'home',
    component: Home
  },
  {
    path: '/about',
    name: 'about',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
  },
  {
    path:'/user',
    name:'user',
    component:()=>import('@/views/User.vue'),
    // props:true,
    children:[
      {
        path:'/posts',
        component:()=>import('@/views/Posts')
      },
      {
        path:'/profile',
        component:()=>import('@/views/Profile')
      }
    ]
  },
  {
    path:'/eaditor',
    name:'eaditor',
    component:()=>import('@/views/Eaditor')
  },
]

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})

export default router

第三步:在App.vue里面制定链接

App.vue代码如下:

// App.vue里面的内容

<template>
  <nav>
    <router-link to="/">首页</router-link> |
    <router-link to="/about">关于</router-link> |
    <router-link to='/user'>User</router-link>  |
    <router-link to='user/posts'>user/posts</router-link> |
    <router-link to='user/profile'>user/profile</router-link> |
    <router-link :to="{name:'eaditor'}">编辑</router-link>

  </nav>
  <router-view/>
  <!-- <router-view></router-view> -->
</template>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
}

nav {
  padding: 30px;
}

nav a {
  font-weight: bold;
  color: #2c3e50;
}

nav a.router-link-exact-active {
  color: #42b983;
}
</style>

第四步:在Eaditor.vue里面设置详细操作步骤和方法:

详细代码请查看Eaditor.vue代码。

运行结果如下:

初始化页面:

 输入内容,数据保存在列表内:

 输入内容,未保存,而点击其它链接,弹出提示窗口。

到这里本文讲的知识点已完毕。

下面是其它组件的代码:

About.vue代码:

<template>
  <div class="about">
    <h1>This is an about page</h1>
  </div>
</template>

 Home.vue代码:

<template>
  <div class="home">
    <img alt="Vue logo" src="../assets/logo.png">
    <HelloWorld msg="Welcome to Your Vue.js App"/>
  </div>
</template>

<script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue'

export default {
  name: 'Home',
  components: {
    HelloWorld
  }
}
</script>

Posts.vue代码:

// Posts.vue里面的内容

<template>
    <div>
        <h2>Posts页面</h2>
    </div>
</template>

<script>
    export default {
        
    }
</script>

<style lang="scss" scoped>

</style>

Profile.vue代码:

// Profile.vue里面的内容

<template>
    <div>
        <h2>Profile页面</h2>
    </div>
</template>

<script>
    export default {
        
    }
</script>

<style lang="scss" scoped>

</style>

User.vue代码:

<template>
    <div>
        <h1>这是User页面</h1>
        <router-view></router-view>
    </div>
</template>

<script>
    export default {

    }
</script>

<style lang="scss" scoped>

</style>

main.js代码:

import { createApp } from 'vue'
import App from './App.vue'
// import Vue from 'vue'
import router from './router'

// Vue.config.productionTip = false

createApp(App).use(router).mount('#app')

// new Vue ({
//     router,
//     render:h=>h(App)
// }).$mount('#app')

其它组件代码都是项目创建时自动创建的,这里就不多做介绍了!

文章内容是小编亲手测试过的,成功的,请想学习的朋友放心参考!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值