• 【好好学习】mh_h5


    老规矩先放下有趣的项目的github地址:
    https://github.com/yw738/mh_h5
    然后我们放下动图

    接下来我们一起分析代码吧
    看包的话,UI部分是有用到有赞的UI
    首先我们看main.js

    import Vue from 'vue'
    
    import router from './router'
    import store from './store'
    import axios from 'axios'
    //获取带参数的值
    import qs from 'qs'
    import App from './App.vue'
    import Vant from 'vant';
    import 'vant/lib/index.css';
    import "@/components/Js/index"
    Vue.use(Vant);
    Vue.config.productionTip = false
    Vue.prototype.$axios = axios;
    Vue.prototype.$qs = qs;
    
    new Vue({
        router,
        store,
        render: h => h(App)
    }).$mount('#app')
    

    接下来看route.js中,我们大概会有哪些入口页面
    里面有用到路由懒加载

    import Vue from 'vue'
    import Router from 'vue-router'
    import List from './views/List.vue'
    import Search from './views/Search.vue'
    Vue.use(Router)
    
    export default new Router({
        mode: 'hash',
        base: process.env.BASE_URL,
        routes: [{
                path: '/',
                name: 'home',
                component: () =>
                    import ('./views/Home.vue')
            }, {
                path: '/list',
                name: 'list',
                component: List
            },
            {
                path: '/search',
                name: 'search',
                component: Search
            },
            {
                path: '/about',
                name: 'about',
                component: () =>
                    import ('./views/About/About.vue'),//按需加载
                // meta: {
                //     isUseCache: true, // 是否需要缓存
                //     keepAlive: true // 缓存
                // }
            },
            {
                path: '/detail',
                name: 'detail',
                component: () =>
                    import ('./views/Detail.vue')
            }
        ]
    })
    

    接下来我们来看App.vue
    在入口route-view中加了判断是不是移动端,不是不显示内容,是就显示内容
    同时还进行了缓存判断,进入到某些页面就会缓存起来

    <template>
      <div id="app">
        <keep-alive include="AboutIndex" max="1" :exclude="isKeepalive?'':'AboutIndex'">
          <router-view v-if="isShow" />
        </keep-alive>
      </div>
    </template>
    <script>
    import { Dialog } from "vant";
    export default {
      data() {
        return {
          isShow: false,//验证用户是否是移动端预览
          isKeepalive: false,//是否对详情进行缓存
        };
      },
      methods: {
        init() {
          var sUserAgent = navigator.userAgent.toLowerCase();
          var bIsIpad = sUserAgent.match(/ipad/i) == "ipad";
          var bIsIphoneOs = sUserAgent.match(/iphone os/i) == "iphone os";
          var bIsMidp = sUserAgent.match(/midp/i) == "midp";
          var bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4";
          var bIsUc = sUserAgent.match(/ucweb/i) == "ucweb";
          var bIsAndroid = sUserAgent.match(/android/i) == "android";
          var bIsCE = sUserAgent.match(/windows ce/i) == "windows ce";
          var bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile";
          if (
            bIsIpad ||
            bIsIphoneOs ||
            bIsMidp ||
            bIsUc7 ||
            bIsUc ||
            bIsAndroid ||
            bIsCE ||
            bIsWM
          ) {
            this.isShow = true;
            //这是移动端
          } else {
            //这是pc端
            this.isShow = false;
            Dialog.alert({
              title: "提示",
              message: "请使用移动设备来浏览该网页,以此得到更友好的体验!"
            }).then(() => {
              // on close
            });
          }
        }
      },
      created() {
        this.init();
      },
      watch: {
        //监听路由 判断是否进行keep-alive动态缓存 
        $route: function(to, from) {
          console.log('to>>>>>>>>>>>>>',to)
          console.log('from>>>>>>>>>>>',from)
          if (to.name === "detail"||to.name === "about") {
            this.isKeepalive = true;
          }else{
            this.isKeepalive = false;
          }
        }
      },
    };
    </script>
    

    接下来我们开始看Home页面
    有搜索还有轮播,以及封装了组件,传入大量图片

    //HOME.vue
    <template>
      <div class>
        <div class="flex tipBox">
          <van-search class="serchBox" disabled placeholder="请输入搜索关键词" @click="toSearch" shape="round" />
          <div>
            <img
              @click="setHouse"
              src="http://css.mangabz.com/v201911081548/mangabz/images/mobile/class.png"
              alt
            />
            <img
              @click="userHome"
              src="http://css.mangabz.com/v201911081548/mangabz/images/mobile/icon_user.png"
              alt
            />
          </div>
        </div>
        <div class="swiper">
          <van-swipe :autoplay="3000" :loop="true" indicator-color="white">
            <van-swipe-item v-for="(item,i) in imgList" :key="i">
              <router-link :to="item.link">
                <img :src="item.url" />
              </router-link>
            </van-swipe-item>
          </van-swipe>
        </div>
    
        <homeList :tit="topBox" :data="topBoxList" />
        <homeList :tit="bottomBox" :data="bottomList" />
        <!-- <div class="index_border" /> -->
        <!-- 申明 -->
        <div class="sm">
          声明 :
          <br />数据均来源于网络,并不参与存储、上传、创作,版权争议与本站无关。 仅学习交流使用,请勿用于商业(非法)用途!否则,一切后果请自行承担!
        </div>
      </div>
    </template>
    
    <script>
    import { homeApi } from "@/api/api";
    import { mapState } from "vuex";
    import homeList from "./Home/HomeList.vue";
    import { Dialog } from "vant";
    
    export default {
      name: "search",
      data() {
        return {
          imgList: [
            {
              link: "/about?url=wbmh69831",
              url:
                "http://img.manhua.weibo.com/hcover/2018/09/07/2084322240_aOFgE7Cs.jpg"
            },
            {
              link: "/about?url=wbmh72406",
              url:
                "http://img.manhua.weibo.com/hcover/2019/07/23/6580997788_6MmPC0WJ.jpg"
            },
            {
              link: "/about?url=wbmh71017",
              url:
                "http://img.manhua.weibo.com/hcover/2018/12/24/6469545963_KjDiUXtX.jpg"
            },
            {
              link: "/about?url=wbmh69375",
              url:
                "http://img.manhua.weibo.com/hcover/2018/09/21/2660188431_ELQqGaB3.jpg"
            }
          ],
          topBoxList: [
            {
              link: "/about?url=http%3A%2F%2F99770.hhxxee.com%2Fcomic%2F32644",
              img:
                "https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D220/sign=9ed36f5f3f4e251fe6f7e3fa9787c9c2/e7cd7b899e510fb3d0c3baf2d633c895d0430cf9.jpg",
              tit: "租借女友",
              txt:
                "作品讲述的是大学生木之下和也和从事恋人租赁服务“租赁女朋友”工作的水原千鹤间的恋爱喜剧"
            },
            {
              link: "/about?url=mh123%2Fcomic%2F8550.html",
              img: "https://img.detatu.com/upload/vod/2019-01-07/15467915857.jpg",
              tit: "穿越球场",
              txt:
                "绪方夏树,初中刚毕业的爱好篮球的北国学生,因为以前的队友的怂恿而报名参加篮球名校藤原学院的选秀会"
            },
            {
              link: "/about?url=mhz209859",
              img:
                "https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike116%2C5%2C5%2C116%2C38/sign=8f5f2b8438adcbef15397654cdc645b8/a6efce1b9d16fdfaf0acd4aebd8f8c5495ee7ba9.jpg",
              tit: "风夏",
              txt:
                "该漫画是濑尾公治以前作《凉风》的主人公秋月大和与朝比奈凉风之女——秋月风夏为女主角"
            },
            {
              link: "/about?url=mh123%2Fcomic%2F2985.html",
              img: "https://img.detatu.com/upload/vod/2019-01-06/154679024514.jpg",
              tit: "东京80年代",
              txt: "纯平参加早稻田大学的入学考试发现一个乡下女孩作弊(森下爱)"
            },
            {
              link: "/about?url=http%3A%2F%2F99770.hhxxee.com%2Fcomic%2F3852",
              img:
                "https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike150%2C5%2C5%2C150%2C50/sign=352ab83f9922720e6fc3eaa81aa26123/5243fbf2b21193138ca3e2ed64380cd790238d8e.jpg",
              tit: "有你的小镇",
              txt: "桐岛青大追随突然消失的枝叶柚希,离开故乡广岛前往东京"
            },
            {
              link: "/about?url=ccmh%2Fmanhua%2F10739",
              img:
                "https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=3736e138a66eddc432eabca958b2dd98/472309f7905298224bccf61edcca7bcb0b46d474.jpg",
              tit: "凉风",
              txt:
                "男主角秋月大和独自来东京求学,居住在澡堂宿舍楼中并与女主角朝比奈凉风恋爱的故事"
            }
          ],
          bottomList: [
            {
              link: "/about?url=mh123%2Fcomic%2F8652.html",
              img:
                "https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike116%2C5%2C5%2C116%2C38/sign=bf79a24c0cb30f242197e451a9fcba26/cefc1e178a82b9018e60ca1e708da9773812efca.jpg",
              tit: "寄生兽",
              txt: "平凡的高中生泉新一和寄生在他体内"
            },
            {
              link: "/about?url=mhz209676",
              img:
                "http://oss.mkzcdn.com/comic/cover/20190416/5cb571cd52a9f-899x1200.jpg!width-300",
              tit: "黑社会的超能力女儿",
              txt: "黑社会的超能力女儿漫画,黑社会干部与从天"
            },
            {
              link: "/about?url=mh123%2Fcomic%2F8816.html",
              img: "https://img.detatu.com/upload/vod/2019-01-07/15467916473.jpg",
              tit: "请叫我英雄",
              txt: "英雄是个曾有过半年连载经验的漫画家"
            },
            {
              link: "/about?url=http%3A%2F%2F99770.hhxxee.com%2Fcomic%2F23246",
              img:
                "https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike116%2C5%2C5%2C116%2C38/sign=6e79620112950a7b613846966bb809bc/21a4462309f79052ba537e0903f3d7ca7bcbd5bc.jpg",
              tit: "家有女友",
              txt: "夏生因为经常在顶楼遇上来此散心的女老师"
            },
            {
              link: "/about?url=mhdhttps%3A%2F%2Fm.manhuadui.com%2Fmanhua%2Fjinjidejuren%2F",
              img: "https://img01.eshanyao.com/images/cover/201810/15391165129WGophC1Qxvw-Z-u.jpg",
              tit: "进击的巨人",
              txt: "进击的巨人的漫画"
            },
            {
              link: "/about?url=mh123%2Fcomic%2F10749.html",
              img: "https://img.detatu.com/upload/vod/2019-01-07/154679216217.jpg",
              tit: "鬼灭之刃",
              txt: "时值日本大正时期。传说太阳下山后,恶鬼出没吃人"
            }
          ],
    
          topBox: {
            title: "人氣推薦"
          },
          bottomBox: {
            title: "編輯推薦"
          }
        };
      },
      methods: {
        toSearch() {
          this.$router.push({ path: "/search" });
        },
        /*
         *用户收藏
         */
        setHouse() {
          Dialog.alert({
            title: "提示",
            message: "暂未开放收藏列表!"
          }).then(() => {
            // on close
          });
        },
        /*
         *用户
         */
        userHome() {
          Dialog.alert({
            title: "提示",
            message: "暂未开放个人中心!"
          }).then(() => {
            // on close
          });
        }
      },
      created() {},
      computed: {},
      components: {
        homeList
      }
    };
    </script>
    
    <style lang="less" scope>
    .swiper,
    .swiper img {
      height: 220px;
       100%;
    }
    .tipBox {
      justify-content: space-between;
      align-items: center;
    }
    .serchBox {
       55%;
    }
    .tipBox img {
      height: 1.4rem;
       1.4rem;
      margin: 0 1rem;
    }
    .sm {
      text-align: left;
      padding: 1rem;
      font-size: 0.8rem;
      color: red;
    }
    </style>
    

    接下来看其引入的homeList组件

    <template>
      <div class="home_box">
        <div class="index_border" />
        <div class="flex flexCen head">
          <div class="tit">{{tit.title}}</div>
          <div class="flex flexCen more">
            <span>更多</span>
            <van-icon name="arrow" size="1.5rem" />
          </div>
        </div>
        <div class="content">
          <van-row>
            <van-col class="home_box_list" span="8" v-for="(v,i) in data" :key="i">
              <router-link :to="v.link">
                <div>
                  <img :src="v.img" />
                  <p class="tit textOverflow">{{v.tit}}</p>
                  <p class="txt textOverflow">{{v.txt}}</p>
                </div>
              </router-link>
            </van-col>
          </van-row>
        </div>
      </div>
    </template>
    
    <script>
    export default {
      name: "",
      data() {
        return {};
      },
      props: {
        tit: { type: Object, default: {} },
        data: { type: Array, default: [] }
      }
    };
    </script>
    
    <style lang="less" scoped>
    .home_box {
      background: #fff;
    }
    .head {
      height: 2rem;
      line-height: 2rem;
      padding: 1rem 1rem 0.5rem;
    }
    .head .tit {
      font-size: 20px;
      color: #121212;
      letter-spacing: 0;
      font-weight: bold;
    }
    .home_box .more span {
      margin-right: 0.4rem;
      font-size: 1rem;
    }
    .content {
      padding: 0 0.5rem;
    }
    .content .home_box_list {
      //   margin-right: 1rem;
      padding: 0.5rem;
    
      box-sizing: border-box;
    }
    .content div:nth-child(3n) {
      margin-right: 0;
    }
    .content img {
       100%;
      height: 140px;
      border-radius: 0.5rem;
    }
    .content .tit {
      margin-top: 5px;
      font-size: 16px;
      color: #121212;
      letter-spacing: 0;
      line-height: 24px;
    }
    .content .txt {
      margin-top: 3px;
      font-size: 12px;
      color: #909090;
      letter-spacing: 0;
      line-height: 14px;
      min-height: 14px;
      margin-bottom: 0;
    }
    </style>
    


    接下来看search页面

    //search.vue
    <template>
      <div class="top">
        <van-search v-model="value" placeholder="请输入搜索关键词" @search="onSearch" show-action shape="round">
          <div slot="action" @click="cancel">取消</div>
        </van-search>
      </div>
    </template>
    
    <script>
    import { mhSerchApi } from "@/api/api";
    import { Toast } from "vant";
    import { mapActions, mapState } from "vuex";
    export default {
      name: "",
      data() {
        return {
          value: ""
        };
      },
      inject: ["getHomeData"],
      methods: {
        ...mapActions(["setSerchKey"]),
        onSearch() {
          let { value: val, getHomeData } = this;
          // console.log("搜索的值:", val);
          console.log('this>>>>>>>>>>',this)
          if (val.trim() === "") {
            getHomeData();
            this.setSerchKey("");
            return;
          }
          this.$emit("serch", []);
          loading();
          mhSerchApi(val).then(res => {
            let { list, code } = res.data;
            if (code === 0) {
              this.setSerchKey(val);
              this.$emit("serch", list);
            } else {
              Toast.fail("服务器挂了");
            }
          });
        },
        cancel() {
          this.$router.push({
            path: "/"
          });
        }
      },
      created() {
        let { serchKey, onSearch } = this;
        if (serchKey !== "") {
          this.value = serchKey;
          onSearch();
        }
      },
      computed: {
        ...mapState(["serchKey"])
      }
    };
    </script>
    
    <style lang='less' scoped>
    </style>
    

    接下来看about页面

    <template>
      <div class="about">
        <div class="back" @click="back">
          <img src="./../../assets/return-details.png" alt />
        </div>
        <div class="img_box">
          <img :src="data.cover" @error="imgErr" class="img" />
        </div>
        <div class="item_box">
          <van-row class="positionR">
            <van-col span="7" class="about_img">
              <img :src="data.cover" />
            </van-col>
            <van-col span="17">
              <div class="tit_box">
                <h3 class="title textOverflow">{{data.name}}</h3>
                <p class="txt">
                  <van-icon name="user-o" />
                  {{data.author}}
                </p>
                <p class="txt">
                  <van-icon name="underway-o" />
                  {{data.time}}
                </p>
              </div>
              <div class="btn_box">
                <!-- like -->
                <!-- <van-icon
                  :name="isHouse?'like':'like-o'"
                  size="2em"
                  color="#fb7299"
                  @click="setHouse"
                  class="like"
                />-->
                <van-button round color="#fb7299" @click="start" type="info">观看{{startJson.name}}</van-button>
              </div>
            </van-col>
          </van-row>
        </div>
        <div
          class="tips tips_box"
          @click="isAllShowTips = !isAllShowTips"
        >{{isAllShowTips?data.introduce:data.introduce.substring(0,90) + '...'}}</div>
        <div class="zj_box">
          <van-row>
            <van-col span="12">
              <div class="sort" style="float:left">全部章节({{list.length}})</div>
            </van-col>
            <van-col span="12">
              <div class="sort" @click="sortFn">
                {{sort?'升序':'降序'}}
                <!-- <van-icon size="1.4em" class="sortTop" name="exchange" /> -->
              </div>
              <div class="sort" @click="chListFn" style="margin: 0 1em;">
                <van-icon size="1.4em" class="sortTop" name="apps-o" />
              </div>
            </van-col>
          </van-row>
        </div>
        <div id="list_box">
          <van-row>
            <van-col :span="listSize" v-for="(item,i) in list" :key="i">
              <div class="list_box">
                <router-link
                  :to="{path:'/detail',query:{url:item.url,num:item.num}}"
                  class="span"
                >{{item.tit}}</router-link>
              </div>
            </van-col>
          </van-row>
        </div>
      </div>
    </template>
    
    <script>
    import { mhListApi } from "@/api/api";
    export default {
      name: "AboutIndex",
      data() {
        return {
          data: {
            introduce: ""
          },
          list: [],
          sort: true,
          startJson: {
            name: "",
            url: ""
          },
          isAllShowTips: false,
          backUrl: null,
          listSize: 8
        };
      },
      methods: {
        back() {
          this.$router.push({ path: this.backUrl || "/" });
        },
        init() {
          loading();
          //获取路由的url
          let { url } = this.$route.query;
          window.sessionStorage.setItem("parentUrl", url);
          let reg = /0|1|2|3|4|5|6|7|8|9|一|二|三|四|五|六|七|八|九|十/g;
          mhListApi(url)
            .then(res => {
              let { data, list, code } = res.data;
              console.log('......data',res.data)
              if (code === 0) {
                list.map(v => {
                  v.tit = v.num.substring(0, 10);
                });
                this.startJson = {
                  name: list[0].tit,
                  url: list[0].url
                };
                window.sessionStorage.setItem("mhList", JSON.stringify(list));
                this.data = data;
                this.list = list;
              }
              load.clear();
            })
            .catch(err => {
              load.clear();
            });
        },
        sortFn() {
          //DESC ASC
          this.sort = !this.sort;
          let arr = this.list;
          this.list = [];
          this.list = arr.reverse();
        },
        chListFn() {
          console.log('listSize',this.listSize)
          this.listSize == 8 ? (this.listSize = 12) : (this.listSize = 8);
        },
        start() {
          let { url } = this.startJson; //这个url 类似id
          console.log('....this.startJson...',this.startJson)
          this.$router.push({
            path: "/detail",
            query: {
              url: url
            }
          });
        },
        setHouse() {
          //添加收藏
        },
        imgErr() {
          console.log('imgBg',imgBg)
          let imgBg = document.querySelector(".img_box .img");
          imgBg.style.background = "#fb7299b5";
        }
      },
      created() {
        this.init();
      },
      computed: {
        isHouse: function() {
          return false;
        }
      },
      beforeRouteEnter(to, from, next) {
        next(vm => {
          if (from.name === "home" || from.name === "list") {
            vm.backUrl = from.path;
          }
        });
      }
    };
    </script>
    
    <style lang='less' scoped>
    @imgHeight: 160px;
    .color,
    .about {
      color: "#333";
    }
    .img_box {
       100%;
      height: @imgHeight;
      overflow: hidden;
    }
    .img {
       100%;
      height: @imgHeight * 2;
      margin-top: -50px;
      filter: blur(10px);
    }
    .tips_box {
      padding: 0 10px;
      margin: 70px 0 10px;
      text-indent: 2em;
      color: #999;
      font-size: 12px;
      line-height: 16px;
    }
    
    .item_box {
       93%;
      margin: 0 3.5%;
      height: auto;
      position: absolute;
      top: 76px;
      left: 0;
    }
    .item_box img {
      height: 100%;
      //  100%;
      border-radius: 2px;
      box-shadow: 0px 0px 11px -10px #000;
    }
    .tit_box {
      padding: 0 4%;
      box-sizing: border-box;
    }
    .title {
      font-size: 21px;
      font-weight: bold;
      margin: 0;
      color: #fff;
    }
    .txt {
      font-size: 12px;
      margin: 2% 0;
      font-weight: normal;
      color: #fff;
    }
    .txt i {
      margin: 3px 3px 0 0;
      float: left;
    }
    .btn_box {
      position: absolute;
      bottom: 0;
      right: 0;
    }
    .btn_box button {
       200px;
    }
    .zj_box {
      color: #505050;
      padding: 0 10px;
      box-sizing: border-box;
      font-size: 14px;
      height: 20px;
      line-height: 20px;
    }
    .zj_box .sort {
      height: 20px;
      line-height: 20px;
      font-size: 14px;
      text-align: right;
      color: #505050;
      float: right;
      display: flex;
      justify-content: center;
      align-items: center;
    }
    .sortTop {
      float: right;
      margin-left: 4px;
      transform: rotate(90deg);
      color: #fb7299;
    }
    .like {
      margin: 6px 6px 0 0;
      float: left;
    }
    #list_box {
      margin-bottom: 30px;
    }
    .about_img {
      height: 140px;
      overflow: hidden;
    }
    </style>
    

    接下来看detail页面

    这个里面挺有意思的,是从路由里面取到数目,做上一章下一章的,然后还有滚动分页,很好玩啊,做这个的思想也很有意思

    <template>
      <div>
        <!-- 图片盒子 -->
        <div id="img_box" @click="choseType">
          <img :src="v.img" v-for="(v,i) in list" :key="i" />
        </div>
        <!-- 操作按钮 -->
        <div class="nav" v-if="isShow">
          <div class="back" @click="back">
            <img src="./../assets/return-details.png" alt />
          </div>
          <div class="morezj">
            <van-button
              round
              color="#fb7299"
              @click="more"
              type="info"
            >{{json.num&&json.num.length>7?json.num.substring(0,7) + '..':json.num}}</van-button>
          </div>
          <div class="nextZj">
            <van-button round color="#000" @click="prevGet" type="info">上一话</van-button>
            <van-button round color="#000" @click="nextGet" type="info">下一话</van-button>
          </div>
        </div>
    
        <!-- 选择章节 -->
        <van-popup
          v-model="popup"
          @close="cancle"
          :duration=".2"
          round
          position="bottom"
          class="popupClass"
          :style="{ height: '70%'}"
        >
          <div>
            <van-row>
              <van-col span="8" v-for="(item,i) in mhlist" :key="i">
                <div class="list_box">
                  <router-link
                    :to="{path:'/detail',query:{url:item.url,num:item.num}}"
                    :class="index ==i?'span active':'span' "
                    @click.native="goDetail(item)"
                  >{{item.tit}}</router-link>
                </div>
              </van-col>
            </van-row>
          </div>
        </van-popup>
      </div>
    </template>
    
    <script>
    import { mhDetailsApi } from "@/api/api";
    import { Toast } from "vant";
    export default {
      name: "",
      data() {
        return {
          allList: [], //所有的图片
          list: [], //图片列表
          json: {}, //当前章节
          isShow: false, //是否显示操作栏
          popup: false, //是否显示章节列表
          mhlist: [], //该漫画所有章节列表
          index: null, //当前漫画的章节
          timer: true, //延时执行
          page: {
            pageSize: 5, //页数
            pageNo: 1, //页码
            maxPage: 1 //最大页数
          }, //分页
          pageIsOver: false //当前章节分页是否结束
        };
      },
      methods: {
        back() {
          let url = window.sessionStorage.getItem("parentUrl");
          this.$router.push({
            path: "/about",
            query: {
              url: url
            }
          });
        },
        cancle() {
          this.isShow = false;
          this.popup = false;
        },
        choseType() {
          console.log('....is')
          this.isShow ? (this.isShow = false) : (this.isShow = true);
        },
        //页面数据初始化
        getData() {
          this.init();
          let { pageSize, pageNo } = this.page;
          let { url } = this.json;
          loading();
          mhDetailsApi(url).then(res => {
            let { code, list } = res.data;
            if (code === 0) {
              this.allList = list;
              this.list = list.slice(parseInt(pageNo.toString()) - 1, parseInt(pageSize.toString()));
              this.page = {
                pageSize: pageSize,
                pageNo: pageNo,
                maxPage: Math.ceil(list.length / parseInt(pageSize))
              };
            }
            load.clear();
          });
        },
        more() {
          let { url } = this.json;
          console.log('url>>>>>>>>>>>',url)
          this.mhlist = JSON.parse(window.sessionStorage.getItem("mhList"));
          console.log('this.mhlist>>>>>>>>>>>??????????',this.mhlist)
          this.mhlist.forEach((v, i) => {
            if (v.url === url) {
              this.index = i;
              return false;
            }
          });
          this.popup = true;
        },
        goDetail(item) {
          console.log('...this.json,item...',)
          Object.assign(this.json,item);
          this.getData();
        },
        getNextUrl() {
          let { url } = this.json;
          let list = JSON.parse(window.sessionStorage.getItem("mhList"));
          let nextJson = null;
          list.forEach((v, i) => {
            if (url === v.url) {
              if (i + 1 >= list.length) return false; //如果是最后一章 直接弹出。
              nextJson = list[i + 1];
            }
          });
          if (nextJson === null) {
            console.log("最后一话");
            return false;
          } else {
            return nextJson;
          }
          console.log('houhhouh',nextJson)
        },
        getPrevUrl() {
          let { url } = this.json;
          console.log(this.json,'...this.json')
          let list = JSON.parse(window.sessionStorage.getItem("mhList"));
          console.log('list',list)
          let nextJson = null;
          list.forEach((v, i) => {
            if (url === v.url) {
              if (i - 1 < 0) return false; //如果是最后一章 直接弹出。
              nextJson = list[i - 1];
            }
          });
          if (nextJson === null) {
            console.log("第一话");
            return false;
          } else {
            return nextJson;
          }
        },
        /*
         * 调用分页
         */
        pageChange() {
          let {
            allList,
            page: { pageSize, pageNo, maxPage }
          } = this;
          pageNo++;
          if (pageNo <= maxPage) {
            this.page = {
              pageNo: pageNo,
              pageSize: pageSize,
              maxPage: maxPage
            };
            this.list = allList.slice(0, pageNo * pageSize);
          } else {
            if(!this.pageIsOver){
              console.log("分页结束");
              Toast("到底了");
              this.pageIsOver = true;
            }
          }
        },
        /*
         *监听下拉
         */
        scroll() {
          let box = document.querySelector("#img_box");
          let that = this;
          let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
          let pageHeight = window.screen.availHeight;
          if (box == null) return;
          let h = box.clientHeight;
          if (scrollTop + pageHeight + 300 > h) {
            clearTimeout(that.timer);
            that.timer = setTimeout(() => {
              that.pageChange(); //开始分页
            }, 300);
            return;
          }
        },
        init() {
          this.page = {
            pageSize: 5, //页数
            pageNo: 1, //页码
            maxPage: 1 //最大页数
          }; 
          this.pageIsOver = false;
          this.isShow=false;
          this.popup=false;
          this.$nextTick(()=>{
            document.documentElement.scrollTop?document.documentElement.scrollTop=0:document.body.scrollTop=0;
          }) //滚动条清零
        },
        /*
         * 切换章节
         */
        prevGet() {
          if (!this.getPrevUrl()) {
            Toast("没有上一章");
            return;
          } //检测是否是第一话
          this.json = this.getPrevUrl();
          this.getData();
        },
        nextGet() {
          if (!this.getNextUrl()) {
            Toast("最后一话!");
            return;
          } //检测是否是最后一章
          this.json = this.getNextUrl();
          this.getData();
        }
      },
      created() {
        let { url, num } = this.$route.query;
        this.json = {
          url: url,
          num: num
        };
        this.getData();
      },
      mounted() {
        window.addEventListener("scroll", this.scroll, false);
      },
      beforeDestroy() {
        if (window.removeEventListener) {
          window.removeEventListener("scroll", this.scroll, false);
        } else if (window.attachEvent) {
          window.attachEvent("scroll", this.scroll, false);
        }
        console.log("初始化scroll事件。");
      }
    };
    </script>
    
    <style lang='less' scoped>
    #img_box {
      display: inline-block;
       100%;
    }
    #img_box img {
      float: left;
       100%;
      border-bottom: 4px solid black;
    }
    .nav {
      position: fixed;
      bottom: 15px;
      left: 10px;
      right: 10px;
      z-index: 999;
    }
    .nav .back {
      position: relative;
       40px;
      height: 40px;
      padding: 0;
      left: 0;
      top: 0;
    }
    .nav > div {
      float: left;
    }
    .nav .back img {
       40px;
      height: 40px;
      background: black;
      border-radius: 50%;
    }
    .morezj {
      margin-left: 10px;
    }
    .popupClass {
      padding: 10px 0;
    }
    .nav .nextZj {
      float: right;
      line-height: 40px;
      font-size: 1rem;
    }
    .nav .nextZj  button{
      margin-left:0.5rem; 
    }
    </style>
    

    看一下搜索的list页面

    <template>
      <div>
        <serch @serch="serch" />
        <div id="content">
          <van-row>
            <van-col span="8" v-for="(item, index) in data" :key="index">
              <router-link :to="{ path: '/about', query: { url: item.url } }">
                <div class="list">
                  <div class="img_box">
                    <img :src="item.cover" />
                  </div>
                  <div>
                    <h3 class="tit">{{ item.name }}</h3>
                    <p class="zj">{{ item.latest }}</p>
                  </div>
                </div>
              </router-link>
            </van-col>
          </van-row>
        </div>
      </div>
    </template>
    
    <script>
    import { homeApi } from "@/api/api";
    import serch from "./Module/Search.vue";
    import { mapState } from "vuex";
    export default {
      name: "list",
      data() {
        return {
          data: [],
          allList:[],
          page:{
            pageSize:20,
            pageNo:1
          }
        };
      },
      provide() {
        return {
          getHomeData: this.getHomeData
        };
      },
      methods: {
        serch(list) {
          this.data = [];
          this.data = list;
          if(load&&load.clear)load.clear();
        },
        getHomeData() {
          homeApi().then(res => {
            let { mhlist } = res.data;
            this.data = mhlist.slice(0, 30);
          });
        },
      },
      created() {
        if (this.serchKey === "") {
          this.getHomeData();
        }
      },
      computed: {
        ...mapState(["serchKey"])
      },
      components: {
        serch
      }
    };
    </script>
    
    <style lang="less">
    .top {
      position: fixed;
      top: 0;
      left: 0;
       100%;
      border-bottom: 1px solid #ebeef5;
      box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
      transition: all ease 0.3;
    }
    .list {
      height: 190px;
      margin: 5px;
      box-sizing: border-box;
    }
    #content {
      margin-top: 56px;
    }
    .img_box,
    .img_box img {
       100%;
      height: 150px;
    }
    .tit,
    .zj {
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
      margin: 2px 0 0 0;
    }
    .tit {
      color: #202121;
      font-size: 13px;
    }
    .zj {
      color: #999;
      font-size: 12px;
    }
    </style>
    
  • 相关阅读:
    十三、mysql 分区之 RANGE && LIST
    十二、mysql sql_mode 简学
    十一、mysql输入安全
    十、mysql事务的简介
    九、mysql触发器的概念
    左链接、右链接
    PHP 对数组数值进行排序,使用另一个容器
    JQUERY基础2 效果 遍历 内置遍历函数
    JQUERY基础
    orcal 单行函数组函数
  • 原文地址:https://www.cnblogs.com/smart-girl/p/12692376.html
Copyright © 2020-2023  润新知