当前位置: 首页 > news >正文

vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)

说明

1.上一章--city.vue的完善(v-if的使用及本地缓存的存储与使用)
2.苍渡大神的源码地址--项目源码地址
3.UI框架--Mint UI
4.数据接口地址--接口API
5.下一章--miste.vue

开始

1.创建
在src下的page文件夹下创建 miste 文件夹,在其中创建 miste.vue文件,代码如下
图片描述

2.路由
在src下的router文件下的routers.js添加miste.vue的路由
图片描述

3.UI
先看一下UI图
图片描述

大家可以分析一下,首先脚部的4个导航肯定是在多个页面都要用的,其次是头部,但是我发现不同的页面头部是不一样的,而且点击事件也不一样。所以,咱们就先做脚部的四个导航。

4.创建页面。
咱们先把脚部的 搜索,订单,我的 这几个页面创建,并添加路由。
图片描述图片描述

5.创建组件
在src下新建文件夹components,所有的组件都写在这里。在components文件下新建文件夹foot,在这里写脚部的组件,代码如下图片描述

6.引入组件
在miste.vue里要是用foot.vue,首先要引入组件,与引入Mint ui组件一样,在script里第一行首先引入

import foot from '../../components/foot/foot'

其次,在components里注册组件

components:{
  //注册组件
    foot
  },

这里要注意,注册组件是components,我以前一直写的是component,得,都得改。

最后使用,直接在页面的template里加上

 <foot></foot>

页面完整代码如下
图片描述

查看页面效果
图片描述
ok!引入脚部组件成功,下面就是写foot.vue 的样式

7.foot.vue样式。
7.1tabbar
在Mint ui 中有一个tabbar组件,与咱们需求相似,在foot.vue使用

<template>
  <div>
    <mt-tabbar v-model="$store.state.selected">
          <mt-tab-item id="miste">
            <img slot="icon">
            外卖 
          </mt-tab-item>
          <mt-tab-item id="order"> 
            <img slot="icon">
            订单
          </mt-tab-item>
          <mt-tab-item id="search">
            <img slot="icon" src="">
            搜索
          </mt-tab-item>
          <mt-tab-item id="profile">
            <img slot="icon">
            我的
          </mt-tab-item>
    </mt-tabbar>
  </div>
</template>

这里v-model绑定的$store.state.selected是当前选中mt-tab-item的id,所以我把ID改成了要跳转页面的名字,在vuex中声明变量selected,打开src下的store下的index.js修改如下
图片描述
selected有一个值是让组件有一个默认值。页面如下
图片描述

7.2 svg图标
vue怎么用svg--点击这里,很简单,就三行代码,咱们直接用。
首先在iconfont下载咱们需要用的svg素材,放到src/svg文件下
图片描述
使用时直接用icon即可,name等于要引用的svg的文件名字

<icon name="miste"></icon>

因为是在Mintui 的tabbar组件里使用,所以还要加上 slot="icon",代码修改如下

<template>
  <div>
    <mt-tabbar v-model="$store.state.selected">
          <mt-tab-item id="miste">
            <icon slot="icon" name="miste"></icon>
            外卖 
          </mt-tab-item>
          <mt-tab-item id="order"> 
            <icon slot="icon" name="order"></icon>
            订单
          </mt-tab-item>
          <mt-tab-item id="search">
            <icon slot="icon" name="search"></icon>
            搜索
          </mt-tab-item>
          <mt-tab-item id="profile">
            <icon slot="icon" name="profile"></icon>
            我的
          </mt-tab-item>
    </mt-tabbar>
  </div>
</template>

页面如下
图片描述

使用成功!但是大家可能发现,svg图标选中时不会自动变色,那咱们就手动来改。首先创建一个class on为选中状态

.on{
    fill:#26a2ff;
}

注意,svg改变颜色不能用color而是要用fill。现在状态写好了,问题是什么时候给元素加上去?只能在点击足部导航时添加,点击导航目前只发生了一件事--selected变为选中的元素的ID。那我们就根据selected的值来添加class,可以狠狠的点击这里来查看官方文档。代码修改如下

<template>
  <div>
    <mt-tabbar v-model="$store.state.selected">
          <mt-tab-item id="miste">
            <icon slot="icon" v-bind:class="[ $store.state.selected=='miste'? 'on' : '']" name="miste" ></icon>
            外卖 
          </mt-tab-item>
          <mt-tab-item id="order"> 
            <icon slot="icon" v-bind:class="[ $store.state.selected=='order'? 'on' : '']" name="order"></icon>
            订单
          </mt-tab-item>
          <mt-tab-item id="search">
            <icon slot="icon" v-bind:class="[ $store.state.selected=='search'? 'on' : '']" name="search"></icon>
            搜索
          </mt-tab-item>
          <mt-tab-item id="profile">
            <icon v-bind:class="[ $store.state.selected=='profile'? 'on' : '']" slot="icon" name="profile"></icon>
            我的
          </mt-tab-item>
    </mt-tabbar>
  </div>
</template>

看看页面
图片描述
恩?还没有变色? onclass我们已经加上了,但是被他自己的fill属性覆盖了。那我们就删除,打开svg下的svg图标,将fill属性删除
图片描述
查看页面
图片描述

变色成功!

7.3路由跳转
现在foot.vue点击只会变色,并没有切换页面,咱们foot.vue引进每个要用的页面里,代码如下
图片描述
因为foot.vue只改变了vuex下的selected的值,所以我们要根据selected的值来进行路由跳转。在foot.vue的计算属性里修改如下

 computed:{
  //计算属性
    gopage:function(){
        return this.$store.state.selected
    }
  },

这样gopage永远返回最新的selected值。但是咱们在哪里调用gopage呢?在watch里调用

 watch:{
      gopage(newval,oldval){
          this.$router.push(newval);
      }
  }

watch可以监听state也可以监听计算属性computed,当他们的值改变时,就会发生回调,接收两个参数,第一个是改变后的新值,第二个是改变前的旧值。foot.vue整体代码如下

<template>
  <div>
    <mt-tabbar v-model="$store.state.selected">
          <mt-tab-item id="miste">
            <icon slot="icon" v-bind:class="[ $store.state.selected=='miste'? 'on' : '']" name="miste" ></icon>
            外卖 
          </mt-tab-item>
          <mt-tab-item id="order"> 
            <icon slot="icon" v-bind:class="[ $store.state.selected=='order'? 'on' : '']" name="order"></icon>
            订单
          </mt-tab-item>
          <mt-tab-item id="search">
            <icon slot="icon" v-bind:class="[ $store.state.selected=='search'? 'on' : '']" name="search"></icon>
            搜索
          </mt-tab-item>
          <mt-tab-item id="profile">
            <icon v-bind:class="[ $store.state.selected=='profile'? 'on' : '']" slot="icon" name="profile"></icon>
            我的
          </mt-tab-item>
    </mt-tabbar>
  </div>
</template>

<script>

export default {
  data () {
    return {
      
    }
  },
  components:{
  //注册组件

  },
  mounted:function(){
  //生命周期
      
  },
  computed:{
  //计算属性
    gopage:function(){
        return this.$store.state.selected
    }
  },
  methods:{
  //函数
      
  },
  watch:{
      gopage(newval,oldval){
          this.$router.push(newval);
      }
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.on{
    fill:#26a2ff;
}
</style>

页面试试
图片描述图片描述

ok!foot组件写完了。咱们现在来写miste.vue

相关文章:

  • Ubuntu设置root密码
  • 把云计算引进到SOA的两个步骤
  • MYSQL在ubuntu的登录问题
  • 《社交网站界面设计(原书第2版)》——3.16 欢迎界面
  • OA行政办公管理系统需求说明书的概写
  • 最优比例生成树(0/1分数规划)
  • KVM安装与使用
  • Windows8手机有截图功能?
  • 迪普科技为上海银视通打造“下一代”数据中心
  • 【热门精品】2012年iOS开发人员必看的精品资料(100个)
  • 理解管理信息系统
  • 程序即人生 » 移动平台现在可用的C++ 11特性
  • 微信诈骗产业链,俩字儿是核心:杀熟
  • 输出IOS 版本号
  • 新连接?新商业 一场关于商业变革的活动正在进行
  • [译] 怎样写一个基础的编译器
  • AHK 中 = 和 == 等比较运算符的用法
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • HomeBrew常规使用教程
  • Python socket服务器端、客户端传送信息
  • SQLServer插入数据
  • webgl (原生)基础入门指南【一】
  • Webpack 4 学习01(基础配置)
  • 对JS继承的一点思考
  • 判断客户端类型,Android,iOS,PC
  • 前嗅ForeSpider中数据浏览界面介绍
  • 日剧·日综资源集合(建议收藏)
  • 什么是Javascript函数节流?
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 正则表达式-基础知识Review
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • # include “ “ 和 # include < >两者的区别
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • $(function(){})与(function($){....})(jQuery)的区别
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (3)nginx 配置(nginx.conf)
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (区间dp) (经典例题) 石子合并
  • (一)基于IDEA的JAVA基础10
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)关于多人操作数据的处理策略
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .netcore 获取appsettings
  • .net程序集学习心得
  • .NET下的多线程编程—1-线程机制概述
  • @font-face 用字体画图标
  • @JSONField或@JsonProperty注解使用
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决