美文网首页
mpvue下不同标签页样式的改变

mpvue下不同标签页样式的改变

作者: 斐硕人 | 来源:发表于2019-04-28 15:55 被阅读0次

首先请通读官方文档
vue官方文档:Class 与 Style 绑定
mpvue官网手册:class-style部分

mpvue不支持 vue官方文档:Class 与 Style 绑定 中的 classObjectstyleObject 语法。
此外还可以用 computed 方法生成 class 或者 style 字符串,插入到页面中

style的使用

  1. 方法一
<li :style="pageName === 'Buddies' ? 'color:#fff;background-color:#0576ff' : ''">
</li>
  1. 方法二
<li :style="styleSelect">
</li>

  computed: {
    styleSelect() {
      return this.pageName === 'Buddies' ? 'color:#fff;background-color:#0576ff' : '';
    }
  },

尝试

  1. 尝试在computed中使用闭包
      <li :style="styleSelect(pageName,'Buddies')">Buddies</li>
      <li :style="styleSelect(pageName,'BuddyRecall')">BuddyRecall</li>

    styleSelect() {
      return function(pageName, nowName) {
        console.log('pageName:'+pageName)
        console.log('nowName:'+nowName)
        return pageName === nowName ? 'color:#fff;background-color:#0576ff' : '';
      }
    }

结果:
点击第一个li,样式未改变,Console如下:

main.js:124 pageName:Buddies
main.js:125 nowName:Buddies
main.js:124 pageName:Buddies
main.js:125 nowName:BuddyRecall

注意:
一次点击两个computed中的方法都执行了
我以为是闭包的问题(该去学习闭包了cry)

  1. 尝试使用methods
      <li :style="styleSelect()">Buddies</li>
      <li :style="styleSelect()">BuddyRecall</li>
  methods: {
    styleSelect() {
      console.log(this.pageName)
      return this.pageName === 'Buddies' ? 'color:#fff;background-color:#0576ff' : '';
    },
  },

结果:
点击第一个li,样式未改变,Console如下:

main.js:124 Buddies
main.js:124 Buddies

注意:
与使用了闭包的computed方法相同
一次点击两个methods中的方法都执行了

  1. 尝试computed不使用闭包
      <li :style="styleSelect">Buddies</li>
      <li :style="styleSelect">BuddyRecall</li>
  computed: {
    styleSelect() {
      console.log(this.pageName)
      return this.pageName === 'Buddies' ? 'color:#fff;background-color:#0576ff' : '';
    },
  },

结果:
点击第一个li,样式都改变,Console如下:

main.js:123 Buddies

点击第二个li,样式都未改变,Console如下:

main.js:123 BuddyRecall

注意:
computed中的方法对应执行一次

  1. computed 与methods 对比
      <li :style="styleSelect">Buddies</li>
      <li :style="styleSelect1()">BuddyRecall</li>
  computed: {
    styleSelect() {
      console.log('now:' + this.pageName)
      return this.pageName === 'Buddies' ? 'color:#fff;background-color:#0576ff' : 'color:#0576ff;background-color:#fff';
    }
  },
  methods: {
    styleSelect1() {
      console.log('Now:' + this.pageName)
      return this.pageName === 'BuddyRecall' ? 'color:#fff;background-color:#0576ff' : 'color:#0576ff;background-color:#fff';
    }
  },

结果:
点击第一个li,样式改变,Console如下:

main.js:123 now:Buddies
main.js:132 Now:Buddies

点击第二个li,样式未改变,Console如下:

now:BuddyRecall
main.js:132 Now:BuddyRecall

注意:
每次点击computed以及methods中的方法都分别执行了,它们依赖的pageName变量每次点击都改变了

分析
  • 2和3可以得出 :
    mpvue可以用 computed 方法生成 style 字符串,插入到页面中,但不支持 methods
  • 1和2得出:
    “两个标签style中调用同一个methods的方法执行两次问题
    因为在style里调用所以页面渲染就会调用(卒),而我在点击事件中描写的方法会使页面重新渲染
  • computed中使用闭包与methods效果相同,像示例这种每个标签都使其依赖的变量发生改变,而造成重新渲染,失去了computed的特性,因此不建议使用计算属性传参
  • 3得出
    同一个computed中的方法(非闭包)在两个style中对应执行一次问题,
    这是因为
    1.计算属性是基于它们的响应式依赖进行缓存的
    2.每当触发重新渲染时,调用方法将总会再次执行函数
    ,详情请看Vue官方文档计算属性缓存vs方法

使用style解决

针对每个标签写对应的style或者style+computed方法,可以看出这种方法使得代码太冗余了

<li :style="pageName === 'Buddies' ? 'color:#fff;background-color:#0576ff' : ''"></li>
<li :style="pageName === 'Buddies' ? 'color:#fff;background-color:#0576ff' : ''"></li>

      <li :style="styleSelect">Buddies</li>
      <li :style="styleSelect1()">BuddyRecall</li>
  computed: {
    styleSelect1() {
      return this.pageName === 'Buddies' ? 'color:#fff;background-color:#0576ff' : '';
    },
    styleSelect2() {
      return this.pageName === 'BuddyRecall' ? 'color:#fff;background-color:#0576ff' : '';
    }
  },

使用Class解决

方法之类的使用与style相同,少写了具体的样式属性(推荐)

   <ul id="top-ul">
      <li :class="pageName === 'Buddies' ? 'activeLi' : ''" >Buddies</li>
      <li :class="pageName === 'BuddyRecall' ? 'activeLi' : ''" >BuddyRecall</li>
    </ul>
.activeLi {
  color: #fff;
  background-color: #0576ff;
} 

问题:
#top-ul>li中有要修改的属性,则activeLi的优先级较低不生效

#top-ul>li{
color: #0576ff;
}

解决:

  1. 将冲突的属性挪到父元素内
#top-ul{
color: #0576ff;
}
  1. 添加冲突的属性至另一个类中(推荐)s
<li :class="pageName === 'BuddyRecall' ? 'activeLi' : 'unActiveLi'" >BuddyRecall</li>
.unActiveLi {
  color: #0576ff;
}

相关文章

  • mpvue下不同标签页样式的改变

    首先请通读官方文档vue官方文档:Class 与 Style 绑定mpvue官网手册:class-style部分 ...

  • 2020-02-19

    编写重置样式 不同的标签有着默认的样式,不同浏览器对标签的解析各不相同,重置css样式可以让标签在不同浏览器下产生...

  • vue 自定义audio标签

    改变audio标签样式 改变原生audio样式 隐藏audio标签,用div实现一个样式 代码详细https://...

  • ios -css

    一、CSS样式简介 行内样式:内联样式)直接在标签的style属性中书写 页内样式:在本网页的style标签中书写...

  • CSS的三种书写方式

    一、行内样式:(内联样式)直接在标签的style属性中书写 二、页内样式:在本网页的style标签中书写 三、外部...

  • dom_1 点击改变颜色

    点击改变标签属性和样式

  • a标签伪类选择器和过度模块

    1.有状态 修改a标签不同状态的样式 a:link{} 修改从未被访问过状态下的样式 a:visited{} 修改...

  • 事件处理 基础一 点击tag改变此按钮颜色

    简述 页面上有不同的标签页,切换不同标签页时,该标签页有不同的颜色。 示例代码 核心技巧 循环绑定每个按钮 先排除...

  • js 常用函数

    获取的ID等于 demo 的值(包含标签) 改变标签的内的值 改变标签的样式 注释 // 单行注释 /**...

  • 全栈小知识-超链接(a标签)的各种状态,对应不同的css样式

    在web开发中我们经常使用到超链接(a标签),超链接(a标签)的样式配置比较特别;因为它在不同状态下可以配置不同展...

网友评论

      本文标题:mpvue下不同标签页样式的改变

      本文链接:https://www.haomeiwen.com/subject/gvwrnqtx.html