文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

VUE的tab页面切换的四种方法

2024-04-02 19:55

关注

1.静态实现方法:

效果图:

在这里插入图片描述


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>view的tab交互</title>
  <link rel="stylesheet" href="../css/demo.css" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >
</head>
<body>
<div class="demo_warp" id="my">
<ul class="tab_tit">
  <li :class="n==1?'active':''" @click="n=1">一</li>
  <li :class="n==2?'active':''" @click="n=2">二</li>
  <li :class="n==3?'active':''" @click="n=3">三</li>
  <li :class="n==4?'active':''" @click="n=4">四</li>
</ul>
<!-- neirong -->
<div class="tab_con">
  <div v-show="n==1">内容一</div>
  <div v-show="n==2">内容二</div>
  <div v-show="n==3">内容三</div>
  <div v-show="n==4">内容四</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script> Vue.config.productionTip=false </script>  
<script src="../js/tab.js" type="text/javascript"></script>
</body>
</html>

css


*{
  margin: 0;
  padding: 0;
  box-sizing:border-box;
}
body,html{
 height: 100%;
}
.demo_warp .tab_tit {
  display: flex;
  flex: 1;
  margin:.2rem;
}
.demo_warp .active { 
  color:red;
  background-color: cadetblue;
}
.demo_warp ul li {
  list-style: none;
  width: 23%;
  text-align: center;
  background-color: #ccc;
  margin:0 1%;
}
.demo_warp .tab_con {
  width: 100%;
  height: 3rem;
  border:1px solid rgb(85, 85, 177);
  text-align: center;
}

js


window.onload=function(){
  new Vue({
    el:'#my',
      data:{//响应式的数据 data变化页面也会跟着变化
     n:1
    }
  })

}

2.第二种模拟动态方法

效果如上图所示:(省略)
代码:


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>view的tab交互</title>
  <link rel="stylesheet" href="../css/demo.css" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >
</head>
<body>
<div class="demo_warp" id="my">
<ul class="tab_tit">
  <li v-for="(v,i) in title" :class="n==i?'active':''" @click="n=i">{{v}}</li>
</ul>
<!-- neirong -->
<div class="tab_con">
  <div v-for="(v,i) in con" v-show="n==i">{{v}}</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script> Vue.config.productionTip=false </script>  
<script src="../js/tab.js" type="text/javascript"></script>
</body>
</html>

css


*{
  margin: 0;
  padding: 0;
  box-sizing:border-box;
}
body,html{
 height: 100%;
}
.demo_warp .tab_tit {
  display: flex;
  flex: 1;
  margin:.2rem;
}
.demo_warp .active { 
  color:red;
  background-color: cadetblue;
}
.demo_warp ul li {
  list-style: none;
  width: 23%;
  text-align: center;
  background-color: #ccc;
  margin:0 1%;
}
.demo_warp .tab_con {
  width: 100%;
  height: 3rem;
  border:1px solid rgb(85, 85, 177);
  text-align: center;
}

js


window.onload=function(){
  new Vue({
    el:'#my',
      data:{//响应式的数据 data变化页面也会跟着变化
     n:0,
     title:["一","二","三","四"],
     con:["内容一","内容二","内容三","内容四"]
    }
  })
}

3.第三种动态数据方法

效果图:(滚动条的实现方式)

在这里插入图片描述

代码:


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>view的tab交互</title>
  <link rel="stylesheet" href="../css/demo.css" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >
</head>
<body>
<div class="demo_warp" id="my">
<ul class="tab_tit">
  <li v-for="(v,i) in lists" :class="n==i?'active':''" @click="n=i">{{v.title}}</li>
</ul>
<!-- neirong -->
<div class="tab_con">
  <div v-for="(v,i) in lists" v-show="n==i">{{v.con}}</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script> Vue.config.productionTip=false </script>  
<script src="../js/tab.js" type="text/javascript"></script>
</body>
</html>

css


*{
  margin: 0;
  padding: 0;
  box-sizing:border-box;
}
body,html{
 height: 100%;
}
.demo_warp .tab_tit{
  display: flex;
  justify-content: space-between;
  white-space: nowrap;
  overflow-y: hidden;
  overflow-x: scroll; 
   margin:1% 1% 1% 0;
}
  ::-webkit-scrollbar{
   display: none;
  }
.demo_warp .active { 
  color:red;
  background-color: cadetblue;
}
.demo_warp ul li {
  list-style: none;
  padding:1.2% 3.2%;
  text-align: center;
  background-color: #ccc;
  margin-left: 1%;
}
.demo_warp .tab_con {
  width: 100%;
  height: 3rem;
  border:1px solid rgb(85, 85, 177);
  text-align: center;
}

js


window.onload=function(){
  new Vue({
    el:'#my',
      data:{//响应式的数据 data变化页面也会跟着变化
     n:0,
     lists:[//可以有很多条数据//数组对象的形式
       {title:'一',con:'内容一'},
       {title:'二',con:'内容二'},
       {title:'三',con:'内容三'},
       {title:'四',con:'内容四'},
       {title:'五',con:'内容五'},
       {title:'六',con:'内容六'},
       {title:'七',con:'内容七'},
       {title:'八',con:'内容八'},
     ]
    }
  })
}

4.动态实现方法(模拟后台数据实现)

效果图:

在这里插入图片描述

代码:


<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>view的tab交互</title>
  <link rel="stylesheet" type="text/css" href="../css/demo.css" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >
</head>
<body>
<div class="demo_warp" id="my">
  <ul class="tab_tit">
    <li v-for="(v,i) in lists" :class="m==i?'active':''" @click="m=i" :key="i.title">{{v.title}}</li>
  </ul>
  <!-- neirong -->
  <div class="tab_con">
    <div v-for="(v,i) in lists" v-show="m==i" :key="i.con">{{v.con}}</div>
  </div>
  <!-- -----------动态数据----------- -->
<ul class="tab_tit">
  <li v-for="(item, index) in itemList" :class="n==index?'active':''" @click="n=index" :key="index">{{item.name}}</li>
</ul>
<!-- neirong -->
<div class="tab_con">
  <div v-for="(item, index) in itemList" v-show="n==index" :key="index">{{item.state}}</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script> Vue.config.productionTip=false </script>  
<script src="../node_modules/axios/dist/axios.js"></script>
<script src="../js/tab.js" type="text/javascript"></script>
</body>
</html>

css


*{
  margin: 0;
  padding: 0;
  box-sizing:border-box;
}
body,html{
 height: 100%;
}
.demo_warp .tab_tit{
  display: flex;
  justify-content: space-between;
  white-space: nowrap;
  overflow-y: hidden;
  overflow-x: scroll; 
   margin:1% 1% 1% 0;
}
  ::-webkit-scrollbar{
   display: none;
  }
.demo_warp .active { 
  color:red;
  background-color: cadetblue;
}
.demo_warp ul li {
  list-style: none;
  padding:1.2% 3.2%;
  text-align: center;
  background-color: #ccc;
  margin-left: 1%;
}
.demo_warp .tab_con {
  width: 100%;
  height: 3rem;
  border:1px solid rgb(85, 85, 177);
  text-align: center;
}

tab.js


window.onload=function(){
  new Vue({
    el:'#my',
      data(){//响应式的数据 data变化页面也会跟着变化
       return{
          n:0,
          m:0,
         lists:[
       {title:'一',con:'内容一'},
       {title:'二',con:'内容二'},
       {title:'三',con:'内容三'},
       {title:'四',con:'内容四'},
       {title:'五',con:'内容五'},
       {title:'六',con:'内容六'},
       {title:'七',con:'内容七'},
       {title:'八',con:'内容八'},
       ], 
        itemList:[]
       }
     },
    methods:{
      getList:function(){//this:--【函数和定时器的this指向都是window (而我们是要this指向vue实例)】
        var that=this;//局部定义改变this指向
        //每执行此方法,提前清空数组,保证往下执行代码,数组为空
        // this.itemList = [];
        axios({
          method:'get',
          url:'http://localhost:4000/list'
        }).then(function(res){
            console.log(res);
            that.itemList = res.data.result;
        }).catch(function(error){
           console.log(error);
        })
      }
    },
    mounted:function(){
         this.getList();
    },
  })
}

nodeServer.js


 

//创建中间介 启动服务 node node.js  
var connect = require('connect');//创建连接
var bodyParser=require('body-parser');//body解析 用于处理 JSON、RAW、Text和URL编码的数据.
var lists = {};
var app = connect()
    .use(bodyParser.json())//JSON解析
    .use(bodyParser.urlencoded({extended:true}))
   //use()方法还有一个可选的路径字符串 对传入请求的URL的开始匹配
   //use()方法来维护一个中间件队列
   .use(function(req,res,next){
    //跨域处理
    //website you wish to allow to connect
    res.setHeader('Access-Control-Allow-origin','*');//允许任何源
    //Request Methods you width to allow
    res.setHeader('Access-Control-Allow-Methods','CET','POST','OPTIONS','PUT','PATCH','DELETE');//允许任何方法
    //Request headers you wish to allow
    res.setHeader('Access-Control-Allow-Headers','*');//允许任何类型
    res.writeHead(200,{"Content-Type":"text/plain/xml;charset=utf-8"});//utf-8转码
    next();//next方法就是一个递归调用
   })
   .use('/list',function(req,res,next){
     var data={
       "code":"200",
       "msg":"success",
       "result":[
         {name:"手机",state:"采购一"},
         {name:"包包",state:"采购二"},
         {name:"衣服",state:"采购三"},
         {name:"电脑",state:"采购四"},
         {name:"电子产品",state:"采购五"}
      ]
     }
     res.end(JSON.stringify(data));
     next();
   })
   .use('/list_get',function(req,res,next){
    var data={
      "code":'200',
      "msg":"success",
      "result":lists
    }
    res.end(JSON.stringify(data));
    next();
   })
   .use('/list_add',function(req,res,next){
     if(req.method=='POST'){
       console.log(req.body.name);
       lists.push({name:req.body.name,state:req.body.state,id:index++});
       var data={"code":200,"msg":"success"};
       res.end(JSON.stringify(data));
     }else{
       res.end(JSON.stringify({}));
     }
     next();
   })
   .use('/list_del',function(req,res,next){
    console.log(req.body.id);
    //lists=lists.filter(list=>list.id!=req.body.id);
    for(var i=0;i<lists.length;i++){
      if(req.body.id===lists[i].id){
            lists.splice(i,1);
      }
    }
    console.log(lists);
    var data={"code":200,"msg":"success"};
    res.end(JSON.stringify(data));
    next();
   })
   .listen(4000);
   console.log('Server started on port 4000.');

插件:(需要下载的插件)

在这里插入图片描述

1.先启动服务node nodeServer.js(不能关闭,否则就会调取不到数据)
2.之后运行html页面 。

项目遇到的bug:

vue中v-for循环遍历后,当前内容不渲染的问题,因为this指向的问题导致.

解决方法一:

在这里插入图片描述

解决方法二:

在这里插入图片描述

解决方法三:

在这里插入图片描述

总结:url:接口要写自己后台的接口哦,这里只是模拟的接口,nodeServer.js文件可以定义多种格式的数据类型,也可以在本地自定义嵌套多种需要的类型,先试用之后可以在调后台数据。

推荐学习VUE:文档 ::https://cn.vuejs.org/v2/guide/list.html

到此这篇关于VUE的tab页面切换的四种方法的文章就介绍到这了,更多相关VUE tab页面切换内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯