详解如何在React组件“外”使用父组件的Props


Posted in Javascript onJanuary 12, 2018

在写SDK项目的时候碰到一个问题:在直播间初始化SDK时使用默认主题,在专题页初始化SDK时使用其它主题。默认主题在打包时挂在全局环境下供多个页面使用,定制主题需要在初始化SDK的时候传入。

实现起来很简单,判断是否有定制主题,有就使用定制主题,没有就使用默认主题。项目下的基本组件大多是这样的:

import { h, Component } from 'lib/preact'
import csjs from 'lib/csjs'
import { theme } from 'lib/platform'

const styles = csjs`
  .app {
    background: ${theme.color};
  }
`

export default class App extends Component {
  render(
    <div className='styles.app'></div>
  )
}

定制主题是通过初始化SDK传进来的,子组件可以通过props或者context拿到,但是却不能在class外的styles里面直接使用。

那么如何实现在组件“外”使用父组件的Props呢?如果我们可以把需要使用的Props挂在“全局环境”下,那么不就可以随便使用了吗?

项目结构如下:

.
|——src
| |——lib //公用库
| |——services //抽离出的方法
| |——index.js
| └──App
|   └──app.js
└── ...

首先,在services中新建一个customTheme.js文件,内容如下:

let value = {}

export default () => {

 const setTheme = (initColor) => {
  value = initColor
 }

 const getTheme = () => {
  return value
 }

 return {
  setTheme,
  getTheme,
 }
}

在index.js文件中我们可以拿到初始化SDK时传入的定制主题对象,这里我们把这个对象存储到customTheme.js里的value中:

import customTheme from './services/customTheme'

...

const setTheme = (customTheme() || {}).setTheme
setTheme && setTheme(customTheme)

...

这样就可以在其它地方直接拿到customTheme的值了

import { h, Component } from 'lib/preact'
import csjs from 'lib/csjs'
import { theme } from 'lib/platform'
import customTheme from '../services/customTheme'
const getTheme = (customTheme() || {}).getTheme
const custom_theme = getTheme && getTheme()
const styles = csjs`
  .app {
    background: ${custom_theme.color || theme.color};
  }
`
export default class App extends Component {
  render(
    <div className='styles.app'></div>
  )
}

哈哈,就是这么简单,分享给跟我一样的菜鸟们,以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
在线编辑器中换行与内容自动提取
Apr 24 Javascript
MooTools 页面滚动浮动层智能定位实现代码
Aug 23 Javascript
使用jquery mobile做幻灯播放效果实现步骤
Jan 04 Javascript
js数组Array sort方法使用深入分析
Feb 21 Javascript
定时器(setTimeout/setInterval)调用带参函数失效解决方法
Mar 26 Javascript
javascript中的取反再取反~~没有意义
Apr 06 Javascript
Javascript非构造函数的继承
Apr 27 Javascript
jQuery实现定时读取分析xml文件的方法
Jul 16 Javascript
JS如何判断json是否为空
Jul 06 Javascript
关于jquery form表单序列化的注意事项详解
Aug 01 jQuery
基于vue中css预加载使用sass的配置方式详解
Mar 13 Javascript
vue-列表下详情的展开与折叠案例
Jul 28 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
Jan 12 #Javascript
微信小程序实现的涂鸦功能示例【附源码下载】
Jan 12 #Javascript
js 索引下标之li集合绑定点击事件
Jan 12 #Javascript
简单的Vue SSR的示例代码
Jan 12 #Javascript
详解如何在react中搭建d3力导向图
Jan 12 #Javascript
关于axios不能使用Vue.use()浅析
Jan 12 #Javascript
Vuex 进阶之模块化组织详解
Jan 12 #Javascript
You might like
PHP静态调用非静态方法的应用分析
2013/05/02 PHP
PHP实现动态执行代码的方法
2016/03/25 PHP
Yii2使用自带的UploadedFile实现的文件上传
2016/06/20 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
PHP中error_reporting函数用法详细介绍
2017/06/11 PHP
JavaScript 定义function的三种方式小结
2009/10/16 Javascript
为JavaScript添加重载函数的辅助方法
2010/07/04 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
2013/08/05 Javascript
js文本框输入点回车触发确定兼容IE、FF等
2013/11/19 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
2014/02/19 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
2014/12/08 Javascript
javascript实现控制文字大中小显示
2015/04/28 Javascript
JavaScript数据库TaffyDB用法实例分析
2015/07/27 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
2017/05/13 jQuery
Vue中props的使用详解
2018/06/15 Javascript
angular4+百分比进度显示插件用法示例
2019/05/05 Javascript
JS实现轮播图效果
2020/01/11 Javascript
原生js+canvas实现贪吃蛇效果
2020/08/02 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
2020/09/16 Javascript
Vue实现Header渐隐渐现效果的实例代码
2020/11/05 Javascript
python实现2048小游戏
2015/03/30 Python
python中迭代器(iterator)用法实例分析
2015/04/29 Python
python 生成器生成杨辉三角的方法(必看)
2017/04/10 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
2020/02/21 Python
Python2 与Python3的版本区别实例分析
2020/03/30 Python
香港时装购物网站:ZALORA香港
2017/04/23 全球购物
凯撒娱乐:Caesars Entertainment
2018/02/23 全球购物
学雷锋演讲稿
2014/03/04 职场文书
数学高效课堂实施方案
2014/03/29 职场文书
食品工程专业求职信
2014/06/15 职场文书
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
村官个人总结范文
2015/03/03 职场文书
南极大冒险观后感
2015/06/05 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
2021/05/25 MySQL
Python使用OpenCV实现虚拟缩放效果
2022/02/28 Python