详解如何在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获取提交的字符串的字节数
Feb 09 Javascript
js跟随滚动条滚动浮动代码
Dec 31 Javascript
基于jquery的lazy loader插件实现图片的延迟加载[简单使用]
May 07 Javascript
JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式)
Aug 04 Javascript
AJAX实现瀑布流触发分页与分页触发瀑布流的方法
May 23 Javascript
jQuery 操作input中radio的技巧
Jul 18 Javascript
Angularjs实现分页和分页算法的示例代码
Dec 23 Javascript
JavaScript数组迭代方法
Mar 03 Javascript
js实现动态显示时间效果
Mar 06 Javascript
jQuery简单实现根据日期计算星期几的方法
Jan 09 jQuery
element-ui 文件上传修改文件名的方法示例
Nov 05 Javascript
Vue+Element自定义纵向表格表头教程
Oct 26 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
默默简单的写了一个模板引擎
2007/01/02 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
2015/12/31 PHP
php实现遍历文件夹的方法汇总
2017/03/02 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
2018/09/04 PHP
laravel异步监控定时调度器实例详解
2019/06/21 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
JSON 学习之完全手册 图文
2007/05/29 Javascript
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
2013/05/07 Javascript
jquery 滚动条事件简单实例
2013/07/12 Javascript
js对象转json数组的简单实现案例
2014/02/28 Javascript
究竟什么是Node.js?Node.js有什么好处?
2015/05/29 Javascript
基于JavaScript实现自动更新倒计时效果
2016/12/19 Javascript
Bootstrap表单使用方法详解
2017/02/17 Javascript
微信小程序之购物车功能
2020/09/23 Javascript
JS中将多个逗号替换为一个逗号的实现代码
2017/06/23 Javascript
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
Vue 权限控制的两种方法(路由验证)
2019/08/16 Javascript
vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解
2020/04/28 Javascript
Python3实现的腾讯微博自动发帖小工具
2013/11/11 Python
Python中的index()方法使用教程
2015/05/18 Python
让python在hadoop上跑起来
2016/01/27 Python
Python利用flask sqlalchemy实现分页效果
2020/08/02 Python
PIL图像处理模块paste方法简单使用详解
2019/07/17 Python
关于ZeroMQ 三种模式python3实现方式
2019/12/23 Python
python解析多层json操作示例
2019/12/30 Python
移动web模拟客户端实现多方框输入密码效果【附代码】
2016/03/25 HTML / CSS
创业计划书——互联网商机
2014/01/12 职场文书
“四风”问题对照检查材料思想汇报
2014/09/16 职场文书
单位委托书怎么写
2014/09/21 职场文书
医院领导班子四风问题对照检查材料
2014/10/26 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
2016最新离婚协议书范本及程序
2016/03/18 职场文书
关于感恩的歌曲整理(8首)
2019/08/14 职场文书
用Python实现Newton插值法
2021/04/17 Python
php双向队列实例讲解
2021/11/17 PHP
【海涛教你打DOTA】黑鸟第一视角解说
2022/04/01 DOTA