在weex中愉快的使用scss的方法步骤


Posted in Javascript onJanuary 02, 2020

weex 是一个可以利用 vue 或者 Rax 编写跨平台手机应用的框架。为了让在 weex 有更好的样式编写体验,遂有了以下的方案。

1.初始化一个 weex 工程

npm install weex-toolkit -g
weex create weex-test
cd weex-test
npm run start

这时候就可以在浏览器看到界面了

2.接着为了可以在vue里面写scss, 我们需要安装两个东西, sass-loader、node-sass

npm install -D sass-loader@7.3.1 node-sass

在这里要注意一点sass-loader要安装 7 版本的,不然会报错,这是因为sass版本高导致的,接下来就可以愉快的写scss,还要注意一点需要在style标签加上语言标记scss

<style lang="scss">
</style>

3.为了更好的组织项目结够和样式的统一,我们会把一些主题颜色、字体大小、文字颜色提取到一个scss文件,我们把它命名为variable.scss如下:

$theme-color: blue;

$font-big: 32px;
$font-nor: 28px;
$font-small: 24px;

我们把它放到项目的src/common/scss下, 需要的时候就在vue文件中引用, 比如在 index.vue 页面引用

<style lang="scss">
@import './common/scss/variable.scss'
div {
  background-color: $theme-color;
}
</style>

这样就可以让应用的主体部分的样式保持一致了。

4.在 weex 中有一些属性不支持简写的方式比如 border,还有一些需要写两三条的样式如文字超出隐藏,这种样式我们可以将它们定义成scss的混合宏(mixin),我们把它命名为mixins.scss

@mixin border($width, $style, $color) {
  border-width: $width;
  border-style: $style;
  border-color: $color;
}
@mixin border-top($width, $style, $color) {
  border-top-width: $width;
  border-top-style: $style;
  border-top-color: $color;
}

我们把它放到项目的src/common/scss下, 需要的时候就在vue文件中引用, 比如在 index.vue 页面引用

<style lang="scss">
@import './common/scss/variable.scss';
@import './common/scss/mixins.scss';
div {
  @include border(1px, solid, $theme-color);
}
</style>

这样我们就可以将一些常用的css代码写进混合宏了

5.在weex中由于不支持类名的权重覆盖,只支持后面的定义的同类样式覆盖前面的样式,这样就会导致我们不能很好的组织 css 代码, 又不能利用 scss 的优势代码层级嵌套。为此我们引入BEM命名方法,并通过scss的混合宏让其在写法上支持嵌套,首先我们在 src/common/scss 下创建 bem.scss,并写入如下代码:

$namespace: '';
$element-separator: '__';
$modifier-separator: '--';

@mixin b($block) {
  @if $namespace == '' {
    $B: $block !global;
  } @else {
    $B: $namespace+'-'+$block !global;
  }

  @if '#{&}' == '' {
    .#{$B} {
      @content;
    }
  } @else {
    @at-root {
      .#{$B} {
        @content;
      }
    }
  }

}

@mixin e($element) {
  $E: $element !global;
  $selector: &;

  @if str-index('#{&}', '__') {
    @at-root {
      .#{$B + $element-separator + $element} {
        @content;
      }
    }
  } @else {
    @at-root {
      #{&+$element-separator+$E} {
        @content;
      }
    }
  }

}
@mixin m($modifier) 
  $M: $modifier !global;
  @at-root {
    #{&+$modifier-separator+$M} {
      @content;
    }
  }
}

由于weex不支持层级所以我们只能用@at-root将所有类名提升到第一层。接着我们在index.vue中引入这个文件:

<template>
  <div class="header">
    <div :class="['header__back', `header__back--${status}`]"></div>
    <div class="header__content"></div>
    <div class="header__other"></div>
  </div>
</template>
<script>
export default {
  data(){
    return {
      status: 'black'
    }
  }
}
</script>
<style lang="scss">
@import './common/scss/variable.scss';
@import './common/scss/mixins.scss';
@import './common/scss/bem.scss'

@include b('header') {
  height: 100px;
  width: 750px;
  flex-direction: row;
  align-items: center;
  @include e('back') {
    flex: 1;
    @include m('black') {
      background-color: #000000;
    }
    @include m('white') {
      background-color: #ffffff;
    }
  }
  @include e('content') {
    flex: 3;
  }
  @include e('other') {
    flex: 1;
  }
}
</style>

编译后的样式为:

.header {
  height: 100px;
  width: 750px;
  flex-direction: row;
  align-items: center;
}
.header__back {
  flex: 1;
}
.header__back--black {
  background-color: #000000;
}
.header__back--white {
  background-color: #ffffff;
}
.header__content {
  flex: 3;
}
.header__other {
  flex: 1;
}

这样看起来用scss的写法代码的结构性和可维护性就会更好一些。

6.由于这三个文件都是需要在每一个vue文件引入的,为了偷一下懒,我们可以用sass-resources-loader 这个loader来让每一个vue文件都注入这几个scss文件

npm install -D sass-resources-loader

然后修改根目录下的 configs/utils.js ,找到如下,进行更改

const generateLoaders = (loader, loaderOptions) => {
  let loaders = options.useVue ? [cssLoader] : []
  if (options.usePostCSS) {
   loaders.push(postcssLoader)
  }
  if (loader) {
   loaders.push({
    loader: loader + '-loader',
    options: Object.assign({}, loaderOptions, {
     sourceMap: options.sourceMap
    })
   })
  }

  //这里加入以下代码
  if (loader === 'sass') {
   loaders.push({
    loader: 'sass-resources-loader',
    options: {
     resources: [
      path.resolve(__dirname, '../src/common/scss/variable.scss'),
      path.resolve(__dirname, '../src/common/scss/mixins.scss'),
      path.resolve(__dirname, '../src/common/scss/bem.scss')
     ]
    }
   })
  }

  if (options.useVue) {
   return ['vue-style-loader'].concat(loaders)
  }
  else {
   return loaders
  }
 }

这样就可以在weex工程中愉快的编写scss了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
对YUI扩展的Gird组件 Part-2
Mar 10 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
Jun 20 Javascript
Extjs4 GridPanel的主要配置参数详细介绍
Apr 18 Javascript
JS实现多物体缓冲运动实例代码
Nov 29 Javascript
利用进制转换压缩数字函数分享
Jan 02 Javascript
关于onchange事件在IE和FF下的表现及解决方法
Mar 08 Javascript
JavaScript更改原始对象valueOf的方法
Mar 19 Javascript
基于jQuery.Hz2Py.js插件实现的汉字转拼音特效
May 07 Javascript
js实现的简洁网页滑动tab菜单效果代码
Aug 24 Javascript
js遍历json对象所有key及根据动态key获取值的方法(必看)
Mar 09 Javascript
详解webpack 多入口配置
Jun 16 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
Mar 20 Javascript
JS实现导航栏楼层特效
Jan 01 #Javascript
JS实现旋转木马轮播图
Jan 01 #Javascript
JS实现普通轮播图特效
Jan 01 #Javascript
javascript实现超好看的3D烟花特效
Jan 01 #Javascript
JavaScript工具库MyTools详解
Jan 01 #Javascript
javascript Canvas动态粒子连线
Jan 01 #Javascript
小程序新版订阅消息模板消息
Dec 31 #Javascript
You might like
一个用于MySQL的PHP XML类
2006/10/09 PHP
PHP源码之 ext/mysql扩展部分
2009/07/17 PHP
PHP5中使用PDO连接数据库的方法
2010/08/01 PHP
PHP日期处理函数 整型日期格式
2011/01/12 PHP
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
2013/04/13 PHP
使用PHP获取当前url路径的函数以及服务器变量
2013/06/29 PHP
深入浅析用PHP实现MVC
2016/03/02 PHP
Yii使用EasyWechat实现小程序获取用户的openID的方法
2020/04/29 PHP
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
jQuery实现的简单拖拽功能示例
2016/09/13 Javascript
jQuery实现获取元素索引值index的方法
2016/09/18 Javascript
Kendo Grid editing 自定义验证报错提示的解决方法
2016/11/18 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
2016/12/08 Javascript
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
2017/03/30 Javascript
js实现添加删除表格(两种方法)
2017/04/27 Javascript
JavaScript仿微信打飞机游戏
2020/07/05 Javascript
Angular项目中$scope.$apply()方法的使用详解
2017/07/26 Javascript
vue项目中axios使用详解
2018/02/07 Javascript
three.js实现圆柱体
2018/12/30 Javascript
JavaScript面试技巧之数组的一些不low操作
2019/03/22 Javascript
写一个Vue loading 插件
2020/11/09 Javascript
从零学Python之入门(五)缩进和选择
2014/05/27 Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
2016/07/01 Python
pytorch 使用加载训练好的模型做inference
2020/02/20 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
Django form表单与请求的生命周期步骤详解
2020/06/07 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
意大利大型购物中心:Oliviero.it
2017/10/19 全球购物
美国半成品食材配送服务商:Home Chef
2018/01/25 全球购物
见习期自我鉴定
2013/11/07 职场文书
活动邀请函范文
2014/01/19 职场文书
践行党的群众路线心得体会
2014/11/05 职场文书
新郎新娘答谢词
2015/01/04 职场文书
医学生自荐信范文
2015/03/05 职场文书
2016十一国庆节感言
2015/12/09 职场文书
Redis实战高并发之扣减库存项目
2022/04/14 Redis