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

uniapp 数字和字母 element ui rules uniapp indexdb_Vue

 

 

二,点击导航栏,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文件自定义模板

uniapp 数字和字母 element ui rules uniapp indexdb_数据_02

 

 

四,在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": "个人中心"
            }
        }
    ],

uniapp 数字和字母 element ui rules uniapp indexdb_Vue_03

 

 

分类模块,scroll-view问题,

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

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

uniapp 数字和字母 element ui rules uniapp indexdb_Vue_04

 

uniapp 数字和字母 element ui rules uniapp indexdb_数据_05

 

 

 

<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>

uniapp 数字和字母 element ui rules uniapp indexdb_数据_06