react-native 结合ant-Design- mobile, 发现有些组件样式不好调,尤其是嵌套很多层的子组件. 解决办法如下

更新: 2017-06-19
新添加方法2 :
更新: 2017-06-23
简单封装 :
更新: 2017-07-03
发现需要使用的地方比较多, 最后封装成函数 :

-现-在的项目使用的是react-native 结合ant-Design- mobile,
但是发现有些组件样式不好调,尤其是嵌套很多层的子组件的字体,颜色,
官方使用style={} 作为props 的方式传递, 但是嵌套很多层的子组件的部分样式没起作用(不知道为什么), 而且react-native中样式基本不具备继承性,除了Text, (想了解的同学可以看大神陈学家的https://segmentfault.com/a/1190000002658374)

1: 先说下解决方法的弊端:
  • 类似web端更改class样式, 只能单个组件的更改, 不能解决更改全局的样式,
    (有想做一键切换主题更改全局样式的这个方法暂时不行, 如果大家发现好的方法,欢迎大家提出)
  • 方法1 只可以在原有的样式对象上更改,不能添加新的样式对象,
    更新的方法2 可以添加新的样式属性
2: 说下解决方法:

方法1:

举个例子: 比如我们现在需要ant-Design- mobile组件中的SegmentedControl

home.js中引入组件SegmentedControl

// home.js
import { SegmentedControl  } from 'antd-mobile';
....
....
....
  render() {
    return(
      <View style={Global.container}>
        <SegmentedControl
          selectedIndex={this.state.selectedIndex}
          values={this.segmentedLabel}
          onChange={this.onChange}
        />
        {this.renderList()}
      </View>
    );
  }

发现字体太小,想调整样式按照组件给的方法, 使用 style= {[fomtStyle: 100]}传入样式 , 没有反应,

解决办法思路如下:

  • 1: 去 node_modules\antd-mobile\lib\segmented-control\index.android.js中源码, 发现字体组件使用的样式是itemText对象
  return _react2["default"].createElement(_reactNative.TouchableWithoutFeedback, { key: idx, onPress: function onPress(e) {
                    return _this2.onPress(e, idx, value);
                } }, _react2["default"].createElement(_reactNative.View, { style: [_style2["default"].item, itemRadius, {
                    backgroundColor: idx === selectedIndex ? tintColor : '#fff',
                    borderColor: tintColor                                                   来看这里
                }] }, _react2["default"].createElement(_reactNative.Text, { style: [_style2["default"].itemText, {
                    color: idx === selectedIndex ? '#fff' : tintColor
                }] }, value)));

2: 然后去此组件的style/index.js 中可以看到这个对象名,

  itemText: {
        textAlign: 'center',
        fontSize: _default2["default"].font_size_caption_sm
    }

3: 在home.js中引用style/index.js , 然后更改对象itemTextfontSize值

  • 但是只可以在原有的样式对象上更改,不能添加新的样式对象,不知道为什么,
    (谁如果知道为什么, 麻烦告诉下)
//引用`style/index.js`
let IndexStyle = require('../../node_modules/antd-mobile/lib/segmented-control/style/index.js');

class Home extends Component {
  constructor(props){
    super(props);
    this.state = {
      selectedIndex: 0,
      textSize: 50,
    };

  //  看这里看这里 更改对象itemText的fontSize值

    IndexStyle.itemText = {
      fontSize: 30,
    }

   /*   想添加一个自己写的信样式对象上去, 结果没有起效果,
     IndexStyle.bgColor = {
         backgroundColor: 'red', 
      }  
  */
    this.segmentedLabel = ['待办', '已办'];
    this.renderList = this.renderList.bind(this);
    this.onChange = this.onChange.bind(this);
  }

方法2:

同上 ,需要先去看源码, 需要改的样式,在源码中定位到名称

比如这里要更改InputItem ant-design-mobile中的InputItem 我们需要看下结构, 想更改的样式在组件哪一个cleassName下
比如我们更改marginLeft 左边的距离

FCZY%X89BF9TY68HUR5RGZT.png

我们需更改styles.container,
styles 则是 import InputItemStyle from './style/index';
所以在 上一级的style文件中找到文件index.tsx
在里面可以看到

![NO]B_@YDHSD%%H2NC@3IH.png](http://upload-images.jianshu.io/upload_images/3512128-762e9138d3511e73.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

我们就可以使用下面的方法来修改,
具体思路就是把所有的样式都拿回来, 扔进一个新的对象, 然后更改, 最后在塞回去

import variables from 'antd-mobile/lib/style/themes/default';  //可能你会用的到,可能不需要, 暂时贴在这, 如果需要就添加,  默认的样式主题 
import InputItemStyle from 'antd-mobile/lib/input-item/style/index';  //引入要更改组件的样式, 

// 定义一个新的样式对象
const newStyle = {};

// 把需要更改的组件的所有样式扔进新的样式对象, 然后更改对应的样式

function changeStyle () {
  for (const key in InputItemStyle) {
    if (Object.prototype.hasOwnProperty.call(InputItemStyle, key)) {
      newStyle[key] = { ...StyleSheet.flatten(InputItemStyle[key]) };
      if (key === 'container') {
        newStyle[key].marginLeft = 15;
      }
    }
  }
}

.................................
// 塞回去

  <InputItem
                key={index}
                在这里: 
                styles={StyleSheet.create(newStyle)}

                style={{marginLeft: 16,}}
                disabled={true}
                placeholder={'请输入'}
                placeholderTextColor={'#999'}
                labelNumber={6}
                value={this.state.formData[item.code]}
                type={item.style === 'number'? 'number': ''}
                maxLength={10}
                onChange={this.setInputValue.bind(this,item)}
                editable={this.state.editable}
              />

我们不仅可以修改原有的样式, 还可以添加新的样式,
局限性就是只能在别人定义好的className 中做操作, 并且得去看源码
上面的方法可以自己做个封装, 方便多次使用

import variables from 'antd-mobile/lib/style/themes/default';
import InputItemStyle from 'antd-mobile/lib/input-item/style/index';
import TextareaItemStyle from 'antd-mobile/lib/textarea-item/style/index';

//简单封装
const newStyle = {};   //InputItem
const TextareaStyle = {}; // 大文本
function changeStyle (newObj,style, cssType, cssName,value) {
  for (const key in style) {
    if (Object.prototype.hasOwnProperty.call(style, key)) {
      newObj[key] = { ...StyleSheet.flatten(style[key]) };
      if (key === cssType) {
        newObj[key][cssName] = value;
      }
    }
  }
}
changeStyle(newStyle,InputItemStyle,'container','borderBottomColor','#fff') // 更改input的下边
changeStyle(newStyle,newStyle,'input','fontSize',16)  // 再次更改input的字体, 所以把上次更改后的样式做为基本样式(style)扔进去
changeStyle(TextareaStyle,TextareaItemStyle,'input','fontSize',16)
在封装一次, 2017-07-03
import ModalStyle from 'antd-mobile/lib/modal/style/index';
import { StyleSheet } from 'react-native';

function changeStyle (newObj,style, data) {
  for (const key in style) {
    if (Object.prototype.hasOwnProperty.call(style, key)) {
      newObj[key] = { ...StyleSheet.flatten(style[key]) };
      if (data.length > 0){
        data.map((item,index) => {
          if( key === item.cssType ) {
            item.val.map((items,indexs) => {
                newObj[key][items.key] = items.value;
            })
          }
        })
      }
    }
  }
}

const newStyle = {};

let myStyle = [
  {
    cssType: 'body',                                         // 要改的样式的类名字
    val: [{key: 'paddingHorizontal', value: 0}]  // 要更改或添加的样式 key 为样式名称, value为值
  },
  {
    cssType: 'header',
    val:  [
           {key:'textAlign', value:  'left'},
           {key:'color', value:  '#fff'},
           {key:'borderTopLeftRadius', value:  5},
           {key:'borderTopRightRadius', value:  5},
           {key:'backgroundColor', value:  '#036b74'},
           {key:'paddingTop', value:  10},
           {key:'paddingBottom', value:  10}
          ]
  },
  {
    cssType: 'innerContainer',
    val: [{key: 'paddingTop', value: 0}]
  }
]

changeStyle(newStyle,ModalStyle,myStyle)

changeStyle(newStyle,ModalStyle,data)
newStyle新命名的空对象,
ModalStyleantd-mobile/xx/style 中引入的原样式对象,
cssType 要改的样式的类名字(cssType: 'innerContainer',), 和更改的css样式名称 key , 及值 value
例: (val: [{key: 'paddingTop', value: 0}])

ok, 更改结束, 此方法基本就能满足平时样式更改,不仅可以更改原有样式, 还能添加样式.
希望阿杜的这个方法能帮到你, 如果大家有更好的方法欢迎您一定要提出, 谢谢

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,274评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,982评论 4 60
  • 柔光,虚光,逆光。 单纯,善良,美好。 连每一个擦肩的颤动每一个眼神的交会都如流水线般统一。想起来这些东西的时候,...
    11咧阅读 175评论 0 1
  • 住宅,就应该是让人感到幸福的场所! 他认为建筑应该消除所有用不到的空间,将真正必要的东西加以组合,找到令人舒适的机...
    杨pure阅读 289评论 0 0
  • 宝宝有头垢?要先确认是乳痂?还是脂溢性皮炎,然后在区别对待。 1乳痂的形成及处理 新生宝宝头皮皮脂腺分泌功能旺盛,...
    守护我的爱阅读 469评论 0 0