1. 程式人生 > 程式設計 >VUE的tab頁面切換的四種方法

VUE的tab頁面切換的四種方法

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.
js
delivr.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,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 RbUiIqjrname="viewport" content="width=device-width,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{
   d程式設計客棧isplay: 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,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,177);
  text-align: center;
}

tab.js

window.onl程式設計客棧oad=function(){
  new Vue({
    el:'#my',data(){//響應式的資料 data變化頁面也會跟著變化
       return{
          n:0,m:0,lists:[
       {title:'標題一',],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

 /*
  connect 是一個node中介軟體 (middeware)框架
  如果把一個http處理過程比作是汙水處理 中介軟體就像是一層層的過濾網
  每個中介軟體把http處理過程中通過改寫 request或(和)response的資料、狀態、實現了特定的功能
  中介軟體就是類似於一個過濾器的東西 在客戶端和應用程式之間的一個處理請求和響應的方法.
 */

//建立中間介 啟動服務 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,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',next){
    var data={
      "code":'200',"result":lists
    }
    res.end(JSON.stringify(data));
    next();
   })
   .use('/list_add',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',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 40www.cppcns.com00.');

外掛:(需要下載的外掛)

在這裡插入圖片描述

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頁面切換內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!