详解如何在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 相关文章推荐
用js实现层随着内容大小动态渐变改变 推荐
Dec 19 Javascript
JQuery Tab选项卡效果代码改进版
Apr 01 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
Mar 18 Javascript
JavaScript中的small()方法使用详解
Jun 08 Javascript
jquery实现的判断倒计时是否结束代码
Feb 05 Javascript
JavaScript实现弹出广告功能
Mar 30 Javascript
js使用html2canvas实现屏幕截取的示例代码
Aug 28 Javascript
Vue异步加载about组件
Oct 31 Javascript
微信小程序 云开发模糊查询实现解析
Sep 02 Javascript
vue cli3适配所有端方案的实现
Apr 13 Javascript
react使用CSS实现react动画功能示例
May 18 Javascript
vue实现树状表格效果
Dec 29 Vue.js
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
操作Oracle的php类
2006/10/09 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
2013/06/19 PHP
easyui的tabs update正确用法分享
2014/03/21 PHP
初识Laravel
2014/10/30 PHP
php中get_magic_quotes_gpc()函数说明
2017/02/06 PHP
javascript 面向对象,实现namespace,class,继承,重载
2009/10/29 Javascript
jquery插件开发方法(初学者)
2012/02/03 Javascript
再谈javascript面向对象编程
2012/03/18 Javascript
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
nodejs npm package.json中文文档
2014/09/04 NodeJs
浅谈JavaScript正则表达式分组匹配
2015/04/10 Javascript
Bootstrap零基础学习第一课之模板
2016/07/18 Javascript
ajax分页效果(bootstrap模态框)
2017/01/23 Javascript
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
2018/03/28 Javascript
微信小程序实现工作时间段选择
2019/02/15 Javascript
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
javascript实现摄像头拍照预览
2019/09/30 Javascript
微信小程序返回箭头跳转到指定页面实例解析
2019/10/08 Javascript
基于javascript实现移动端轮播图效果
2020/12/21 Javascript
手写Vue2.0 数据劫持的示例
2021/03/04 Vue.js
django manage.py扩展自定义命令方法
2018/05/27 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
2018/11/29 Python
python写程序统计词频的方法
2019/07/29 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
2020/07/03 Python
Pandas中DataFrame基本函数整理(小结)
2020/07/20 Python
Python 如何实现访问者模式
2020/07/28 Python
pandas apply多线程实现代码
2020/08/17 Python
基于Canvas+Vue的弹幕组件的实现
2019/07/23 HTML / CSS
营业员个人总结的自我评价
2013/10/25 职场文书
函授教育个人学习的自我评价
2013/12/31 职场文书
公司周年庆典策划方案
2014/05/17 职场文书
红领巾广播站广播稿
2014/10/19 职场文书
2015年国庆节广播稿
2015/08/19 职场文书
Python 中面向接口编程
2022/05/20 Python