详解如何在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 相关文章推荐
List Information About the Binary Files Used by an Application
Jun 11 Javascript
JavaScript 变量基础知识
Nov 07 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
May 07 Javascript
jQuery使用slideUp方法实现控制元素缓慢收起
Mar 27 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
Dec 14 Javascript
BootStrap select2 动态改变值的方法
Feb 10 Javascript
AngularJS+bootstrap实现动态选择商品功能示例
May 17 Javascript
解决Vue打包之后文件路径出错的问题
Mar 06 Javascript
vue select选择框数据变化监听方法
Aug 24 Javascript
Vue2实时监听表单变化的示例讲解
Aug 30 Javascript
使用webpack打包后的vue项目如何正确运行(express)
Oct 26 Javascript
通过js随机函数Math.random实现乱序
May 19 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缩放gif和png图透明背景变成黑色的解决方法
2014/10/14 PHP
WordPress分页伪静态加html后缀
2016/06/08 PHP
用JavaScript实现UrlEncode和UrlDecode的脚本代码
2008/07/23 Javascript
你需要知道的10个最佳javascript开发实践小结
2012/04/15 Javascript
使用jQuery设置disabled属性与移除disabled属性
2014/08/21 Javascript
jQuery仿淘宝网产品品牌隐藏与显示效果
2015/09/01 Javascript
3种js实现string的substring方法
2015/11/09 Javascript
跟我学习javascript的浮点数精度
2015/11/16 Javascript
js实现根据身份证号自动生成出生日期
2015/12/15 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
JS获取一个未知DIV高度的方法
2016/08/09 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
js实现简单的选项卡效果
2017/02/23 Javascript
JavaScript正则获取地址栏中参数的方法
2017/03/02 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
Vue作用域插槽slot-scope实例代码
2018/09/05 Javascript
vue.js中proxyTable 转发请求的实现方法
2018/09/20 Javascript
js实现弹出框的拖拽效果实例代码详解
2019/04/16 Javascript
[00:43]TI7不朽珍藏III——幽鬼不朽展示
2017/07/15 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
python三元运算符实现方法
2013/12/17 Python
用Python进行行为驱动开发的入门教程
2015/04/23 Python
spyder常用快捷键(分享)
2017/07/19 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
学python最电脑配置有要求么
2020/07/05 Python
python中用ggplot绘制画图实例讲解
2021/01/26 Python
详解HTML5中rel属性的prefetch预加载功能使用
2016/05/06 HTML / CSS
乐高官方旗舰店:LEGO积木玩具
2019/04/06 全球购物
菲律宾优惠券网站:MetroDeal
2019/04/12 全球购物
电子商务个人自荐信
2013/12/12 职场文书
写自荐信三大法宝
2014/01/24 职场文书
社会调查研究计划书
2014/05/01 职场文书
小学优秀班干部事迹材料
2014/05/25 职场文书
党支部遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
【海涛解说】史上最给力比赛,挑战DOTA极限
2022/04/01 DOTA
2022年显卡天梯图(6月更新)
2022/06/17 数码科技