详解如何在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 相关文章推荐
jquery 元素相对定位代码
Oct 15 Javascript
js写的评论分页(还不错)
Dec 23 Javascript
js中for in的用法示例解析
Dec 25 Javascript
全面兼容的javascript时间格式化函数(比较实用)
May 14 Javascript
ztree获取当前选中节点子节点id集合的方法
Feb 12 Javascript
微信小程序 基础组件与导航组件详细介绍
Feb 21 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
Mar 05 Javascript
浅析vue给不同环境配置不同打包命令
Aug 17 Javascript
使用pm2自动化部署node项目的方法步骤
Jan 28 Javascript
js实现unicode码字符串与utf8字节数据互转详解
Mar 21 Javascript
微信小程序实现录音时的麦克风动画效果实例
May 18 Javascript
解决layui富文本编辑器图片上传无法回显的问题
Sep 18 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里的中文变量说明
2011/07/23 PHP
PHP缓存技术的多种方法小结
2012/08/14 PHP
ThinkPHP独立分组使用的注意事项
2014/11/25 PHP
php模拟用户自动在qq空间发表文章的方法
2015/01/07 PHP
php魔术函数__call()用法实例分析
2015/02/13 PHP
php通过exif_read_data函数获取图片的exif信息
2015/05/21 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
2016/09/19 PHP
php array_map使用自定义的函数处理数组中的每个值
2016/10/26 PHP
javascript获取设置div的高度和宽度兼容任何浏览器
2013/09/22 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
JavaScript中的this使用详解
2016/07/27 Javascript
js 能实现监听F5页面刷新子iframe 而父页面不刷新的方法
2016/11/09 Javascript
原生js更改css样式的两种方式
2017/03/15 Javascript
3分钟快速搭建nodejs本地服务器方法运行测试html/js
2017/04/01 NodeJs
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
Vue form表单动态添加组件实战案例
2019/09/02 Javascript
Vue实现滑动拼图验证码功能
2019/09/15 Javascript
js判断一个对象是数组(函数)的方法实例
2019/12/19 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
基于JS实现快速读取TXT文件
2020/08/25 Javascript
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
python实现linux下使用xcopy的方法
2015/06/28 Python
浅谈python中的__init__、__new__和__call__方法
2017/07/18 Python
python selenium UI自动化解决验证码的4种方法
2018/01/05 Python
python使用ctypes调用扩展模块的实例方法
2020/01/28 Python
详解Python直接赋值,深拷贝和浅拷贝
2020/07/09 Python
python3.6中anaconda安装sklearn踩坑实录
2020/07/28 Python
Python eval函数介绍及用法
2020/11/09 Python
完美解决Pycharm中matplotlib画图中文乱码问题
2021/01/11 Python
泰国折扣酒店预订:Hotels2Thailand
2018/03/20 全球购物
大学系主任推荐信范文
2013/12/24 职场文书
大学生工作自荐书
2014/06/16 职场文书
地球一小时宣传标语
2014/06/24 职场文书
学生实习证明范文
2014/09/28 职场文书
身份证丢失证明
2015/06/19 职场文书