zoukankan      html  css  js  c++  java
  • uniapp(二)

    一,如果写了样式,获取写了结构,微信小程序没有效果,那么需要删除打包的文件,微信小程序有缓存

    二,点击导航栏,active类动态展示,通过自定义索引实现逻辑

        <scroll-view scroll-x="true" class="navScroll" enable-flex="true" v-if="indexData.kingKongModule">
                <view class="navItem" 
                :class="currentIndex===-1?'active':''"
                @click="changeNavIndex(-1)"
                >推荐</view>
                <view class="navItem" 
                v-for="(item,index) in indexData.kingKongModule.kingKongList"
                :key="item.L1Id"
                :class="currentIndex===index?'active':''"
                @click="changeNavIndex(index)"
                >{{item.text}}</view>
            </scroll-view>
        data() {
                return {
                    // indexData:{},
                    currentIndex:-1
                }
            },
    methods:{
                changeNavIndex(navIndex){
                    this.currentIndex=navIndex;

    三,首页模块(抽取组件,自定义模板)

    3.1,项目中创建compoents文件夹---》recommend文件夹->recommend.vue

    index.vue是父组件, recommend.vue是子组件

    3.2,在父组件中引入子组件,注意是要相对路径,否则报错

        import Recommend from '../../components/recommend/recommend.vue';

    注册

        components:{
                Recommend
            },
    <scroll-view scroll-x="true" class="navScroll" enable-flex="true" v-if="indexData.kingKongModule">
                <view class="navItem" 
                :class="currentIndex===-1?'active':''"
                @click="changeNavIndex(-1)"
                >推荐</view>
                <view class="navItem" 
                v-for="(item,index) in indexData.kingKongModule.kingKongList"
                :key="item.L1Id"
                :class="currentIndex===index?'active':''"
                @click="changeNavIndex(index)"
                >{{item.text}}</view>
            </scroll-view>
            
            <Recommend />

    可对vue文件自定义模板

    四,在recommend组件中设置轮播图静态页面

    <template>
        <div class="recommendContainer">
            <swiper class="bannerSwiper" :indicator-dots="true" :autoplay="true" :interval="3000" :duration="1000">
                <swiper-item class="bannerItem">
                    <image class="bannerImg" src="https://yanxuan.nosdn.127.net/c33662e673045cf8488de48a8a44719f.jpg?type=webp&imageView&quality=75&thumbnail=750x0" mode=""></image>
                </swiper-item>
                <swiper-item class="bannerItem">
                    <image class="bannerImg" src="https://yanxuan.nosdn.127.net/77ff665c81b2c6cf320615cab87ce6eb.jpg?type=webp&imageView&quality=75&thumbnail=750x0" mode=""></image>
                </swiper-item>
                <swiper-item class="bannerItem">
                    <image class="bannerImg" src="https://yanxuan.nosdn.127.net/72440d65cbb26a337dbf84233d97e23b.jpg?type=webp&imageView&quality=75&thumbnail=750x0" mode=""></image>
                </swiper-item>
            </swiper>

    五,首页模块(vuex的使用)

    5.1,安装vuex,npm  i vuex,  在项目中新建store文件夹,新建index,js, 在store中新建modules文件夹,新建home.js,建立子状态管理模块

    在index.js引入子模块,

    import Vue from "vue";
    import Vuex from "vuex";
    import home from "./modules/home.js";
    
    Vue.use(Vuex);
    
    export default new Vuex.Store({
      modules: {
        home,
      },
    });

    home.js, vuex的四大天王

    只能传入一个参数,如果是一个数据,就这样,如果是多个数据,必须是一个对象传入
    test3(store,data){
    // console.log('store',store); // console.log('data',data) store.state.initData=data.initData }

    使用常量替代 Mutation 事件类型

    用不用常量取决于你——在需要多人协作的大型项目中,这会很有帮助。但如果你不喜欢,你完全可以不这样做

    新建mutation-type.js文件,分别暴露

    export const SETINDEXDATA="setindexdata";
    import {SETINDEXDATA} from '../mutation-types.js';
    import request from '../../utils/request.js'
    const state={
        initData:"我是初始数据",
        indexData:{}
    }
    
    const mutations={
        // test(state,data){
        //     console.log('test1')
        //     setTimeout(()=>{
        //         state.initData="我是修改之后数据"
        //     },2000)
        // },
        // test2(state){
        //     console.log('test2')
        //     state.initData="我是修改之后数据2"
        // }
        // [TEST](state){
        //     console.log("我是甲程序猿创建的test")
        // },
        [SETINDEXDATA](state,indexData){
            state.indexData=indexData
        }
    }
    
    const actions={
    可以在actions修改数据,一般不这样做,在mutations中修改
    // test3(store,data){ // // console.log('store',store); // // console.log('data',data) // store.state.initData=data.initData // } async getIndexData({commit}){ let result = await request('/getIndexData'); if(!result){ console.log('请求失败') //可以防止初始值,提前准备体量较小的数据,保证页面展示 result=["推荐","居家生活","服饰鞋包"]; } commit(SETINDEXDATA,result) } } const getters={ } export default { state, mutations, actions, getters }

    记得在main.js中引入index,js

    import Vue from 'vue'
    import App from './App'
    
    import store from './store/index.js';
    
    //关闭Vue代码警告提示
    Vue.config.productionTip = false
    
    //mp->mini program   type->类型    ->App组件代表整个小程序
    App.mpType = 'app'
    
    const app = new Vue({
        ...App,
        store
    })
    app.$mount()

    六,在recommend中新建category的组件

    6.1,新建category组件,然后在recommend中引入,注册

        import Categorys from '../categorys/categorys.vue';
        components:{
                Categorys
            }
        <Categorys v-for="categoryObj in indexData.categoryModule" :categoryObj="categoryObj" :key="categoryObj.titlePicUrl"/>

    利用props将数据传给子组件,然后数据渲染

    props:["categoryObj"]
    <template>
        <div class="categorysContainer">
            <image class="bigBanner" :src="categoryObj.titlePicUrl" mode=""></image>
            <scroll-view class="categoryList" scroll-x="true" >
                <view class="categoryItem" v-for="category in categoryObj.itemList" :key="category.id">
                    <image class="common" :src="category.showPicUrl" mode=""></image>
                    <text>{{category.name}}</text>
                </view>
                <view class="categoryItem common more">查看更多></view>
            </scroll-view>
        </div>
    </template>

    分类模块配置,tabbar页面

    在page.json中配置tabbar页, 然后在page文件夹新建category, cart, personal页面,

        "tabBar":{
            "color":"#555",
            "selectedColor":"#D43C33",
            "list": [
                {
                    "pagePath": "pages/index/index",
                    "text": "首页",
                    "iconPath":"/static/images/tabBar/tab-home.png",
                    "selectedIconPath": "/static/images/tabBar/tab-home-current.png"
                },
                {
                    "pagePath": "pages/category/category",
                    "text": "分类",
                    "iconPath":"/static/images/tabBar/tab-cate.png",
                    "selectedIconPath": "/static/images/tabBar/tab-cate-current.png"
                },
                {
                    "pagePath": "pages/cart/cart",
                    "text": "购物车",
                    "iconPath":"/static/images/tabBar/tab-cart.png",
                    "selectedIconPath": "/static/images/tabBar/tab-cart-current.png"
                },
                {
                    "pagePath": "pages/personal/personal",
                    "text": "个人中心",
                    "iconPath":"/static/images/tabBar/tab-my.png",
                    "selectedIconPath": "/static/images/tabBar/tab-my-current.png"
                }
            ]
            
        }

    然后在page.json中pages属性中配置路径

        "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
            {
                "path": "pages/category/category",
                "style": {
                    "navigationBarTitleText": "分类"
                }
            },{
                "path": "pages/index/index",
                "style": {
                    "navigationBarTitleText": "首页"
                }
            },{
                "path": "pages/cart/cart",
                "style": {
                    "navigationBarTitleText": "购物车"
                }
            },{
                "path": "pages/personal/personal",
                "style": {
                    "navigationBarTitleText": "个人中心"
                }
            }
        ],

    分类模块,scroll-view问题,

    问题;scroll-view,设置 scroll-y="true" 属性,如果顶部有个搜索栏,让页面竖直滑动,那么滑动的是整个页面(包括顶部的搜索栏,调用的是系统滚动条)

    我们需要给scroll-view计算高度,height: cacl(100vh - 82upx), 82upx是整个搜索框的高度,页面底部的tabbar不用计算,cacl还有四舍五入,需要注意

    <div class="a">
            <view class="b">
                <view  class="c">搜索商品</view>
                
            </view>
            
            <view class="content">
                <!-- 左边 -->
                <view class="left">
                    <scroll-view class="d"  scroll-y="true" >
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                        <view class="e">居家生活</view>
                    </scroll-view>
                    
                </view>

    css

    .a
            .b
                height 60upx
                padding 10upx 20upx
                // margin 10upx 20upx
                border-bottom 2upx solid
                
                
                .c
                    height 60upx
                    width 100%
                    text-align center
                    border-radius 15upx
                    line-height 60upx
                    background-color #eee
            .content
                height calc(100vh - 82upx)
                
                .left
                    height 100%
                    .d
                        height 100%
                        .e
                            width 148upx
                            height 80upx
                            font-size 26upx

    在服务器中配置路由,发送响应数据

        
    // 用于分类页面的数据请求
    const categoryDatas= require('./datas/categoryDatas.json');
    router.get('/getCategoryDatas',function(ctx,next){
        // console.log('/test');
        //返回数据
        ctx.body=categoryDatas
    })
        

    发送请求,获取数据

            async mounted(){
                let result = await request('/getCategoryDatas');
                console.log(result)
                this.categoryDatas=result;
                this.currentId=result[0].id;
            },

    点击左边的商品标签,通过自定义变量currentId控制active类

        <view class="leftContainer">
                    <scroll-view class="navScroll" scroll-y="true" >
                        <view class="navItem" :class="currentId===category.id?'active':''" @click="changeNavId(category.id)" v-for="category in categoryDatas" :key="category.id">{{category.name}}</view>
                    </scroll-view>
                </view>
        methods:{
                changeNavId(id){
                    this.currentId=id;
                    console.log(this.currentId,id)
                }
            },
        data(){
                return {
                    categoryDatas:[],
                    currentId:null
                }
            },

    点击左边的标签,通过id,找到与之对应的数据

            computed:{
                cateList(){
                    //find filter evey some
                    //find        返回值是第一个符合条件的对象
                    //filter    返回值是数组
                    let result=this.categoryDatas.find((item,index)=>item.id===this.currentId);
                    console.log(result)
                    return result;
                }
            }

    填充数据

                <view class="rightContainer">
                    <scroll-view scroll-y="true" class="contentScroll">
                        <view class="scrollHeader">
                            <image class="headerImg" :src="cateList.imgUrl" mode=""></image>
                        </view>
                        <view class="contentItem" v-for="item in cateList.subCateList" :key="item.id">
                            <image :src="item.wapBannerUrl" mode=""></image>
                            <text>{{item.name}}</text>
                        </view>
                    </scroll-view>
                </view>

  • 相关阅读:
    使用Beautiful Soup扒取指定标题
    平时笔记
    2017年暑期大数据培训小记
    ZoomIt的使用方法
    ASP.NET使用富文本控件KindEditor(一步到位,亲测有效)
    ASP.NET使用Ajax返回Json对象
    Python简易爬虫
    Class.forName()用法详解
    【4-1】js函数、事件、补充知识
    【3-30】document获取、事件、标记样式
  • 原文地址:https://www.cnblogs.com/fsg6/p/13674534.html
Copyright © 2011-2022 走看看