React styled-components设置组件属性的方法


Posted in Javascript onAugust 07, 2018

问题

最近在试着用react做一个音乐播放器,在这之前其实并不了解styled-components,但由于使用css in js并且想实现hover效果,百度各种解决方案后发现了styled-components这个好东西,如果你看到了这篇博客,就证明你应该了解或者熟练运用styled-components了。

回到项目开发中,一个音乐播放器应该由多个组件组成,其中有一个list组件用于展示歌曲列表,就像这样

React styled-components设置组件属性的方法 

鹅。。。好像暴露了我的喜好。。。

每一列就是一个div(当然ul也是可以的),为了方便后续功能的实现,我把每首歌的海报、音频文件的地址当做div的属性储存起来。list组件的代码如下

import React from 'react';
import styled from 'styled-components';

// 设置样式
const ContentDiv = styled.div`
  display: flex;
  justify-content: space-between;
  height: 50px;
  line-height: 50px;
  transition: 0.5s;
  cursor: pointer;
  &:hover{
    color: #31c27c;
  }
`;

const LengthDiv = styled.div`
  color: #999;
`;

// list组件
class List extends React.Component {
  constructor(props){
   super(props);
   this.state = {
    // 播放列表
    list: this.props.list
   };
  }

  render(){
    const listItem = this.state.list.map((item, index) => {
      return (
        <ContentDiv key={ item.name } poster={ item.poster } audio={ item.music }>
          <div>
            { item.name } - { item.author }
          </div>
          <LengthDiv>
            { item.length }
          </LengthDiv>
        </ContentDiv>
      );
    });

    return (
      <div>
        { listItem }
      </div>
    )
  }
}

export default List;

代码很简单,但最后我们会发现这样一个问题——在页面中生成的div元素只有poster属性而没有audio属性

React styled-components设置组件属性的方法 

打开react developer tools查看

React styled-components设置组件属性的方法 

这时可以发现其实并不是styled.div直接编译成原生html元素,而是会生成一个div(当然,如果是styled.button就会额外生成一个子button),最后在页面中显示的就是这个div。
也可以发现在styled.div中两个属性都是设置好的,但在子div中就只有一个属性了,通过反复尝试可以发现,直接在styled-components组件中设置属性,除了className之外就只有一个属性会生效

解决

解决的办法就是多看几遍styled-components文档,我们就会发现styled-components有一个attr方法来支持为组件传入 html 元素的其他属性,那么原来的list组件就只需要修改ContentDiv变量即可

const ContentDiv = styled.div.attrs({
 poster: props => props.poster,
 audio: props => props.audio
})`
  display: flex;
  justify-content: space-between;
  height: 50px;
  line-height: 50px;
  transition: 0.5s;
  cursor: pointer;
  &:hover{
    color: #31c27c;
  }
`;

props对象就是我们传入ContentDiv的属性,这样一来,最后生成的div中poster与audio属性都有。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript调用浏览器打印功能实例分析
Jul 17 Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
Oct 31 Javascript
基于JavaScript实现自动更新倒计时效果
Dec 19 Javascript
详解百度百科目录导航树小插件
Jan 08 Javascript
jQuery实现简单的抽奖游戏
May 05 jQuery
深入理解ES6 Promise 扩展always方法
Sep 26 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
Sep 26 Javascript
如何进行微信公众号开发的本地调试的方法
Jun 16 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
Oct 25 Javascript
JS实现随机抽选获奖者
Nov 07 Javascript
JS实现打字游戏
Dec 17 Javascript
SpringBoot在yml配置文件中配置druid的操作
Nov 16 Javascript
微信小程序methods中定义的方法互相调用的实例代码
Aug 07 #Javascript
详解vue axios用post提交的数据格式
Aug 07 #Javascript
解决koa2 ctx.render is not a function报错问题
Aug 07 #Javascript
使用Nuxt.js改造已有项目的方法
Aug 07 #Javascript
echarts实现地图定时切换散点与多图表级联联动详解
Aug 07 #Javascript
详解Nuxt.js部署及踩过的坑
Aug 07 #Javascript
解决vue 中 echart 在子组件中只显示一次的问题
Aug 07 #Javascript
You might like
UCenter中的一个可逆加密函数authcode函数代码
2010/07/20 PHP
PHP常用的排序和查找算法
2015/08/06 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
2017/08/07 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
基于jQuery的弹出消息插件 DivAlert之旅(一)
2010/04/01 Javascript
推荐40个简单的 jQuery 导航插件和教程(下篇)
2012/09/14 Javascript
键盘KeyCode值列表汇总
2013/11/26 Javascript
laypage分页控件使用实例详解
2016/05/19 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
2017/04/26 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
微信小程序实现的绘制table表格功能示例
2019/04/26 Javascript
js Array.slice的8种不同用法示例
2019/07/10 Javascript
Cython 三分钟入门教程
2009/09/17 Python
Python正则表达式使用经典实例
2016/06/21 Python
Python中__slots__属性介绍与基本使用方法
2018/09/05 Python
Python帮你微信头像任意添加装饰别再@微信官方了
2019/09/25 Python
Python生成随机验证码代码实例解析
2020/06/09 Python
Python ellipsis 的用法详解
2020/11/20 Python
python代码实现图书管理系统
2020/11/30 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
2021/02/22 Python
Django和Ueditor自定义存储上传文件的文件名
2021/02/25 Python
一款css实现的鼠标经过按钮的特效
2014/09/11 HTML / CSS
亚马逊加拿大网站:Amazon.ca
2020/01/06 全球购物
市场部规章制度
2014/01/24 职场文书
社区戒毒工作方案
2014/06/04 职场文书
分公司经理任命书
2014/06/05 职场文书
学校运动会广播稿100条
2014/09/14 职场文书
临时租车协议范本
2014/09/23 职场文书
重阳节简报
2015/07/20 职场文书
初中毕业感言300字
2015/07/31 职场文书
2019年怎样写好导游词?
2019/07/02 职场文书
Python中使用ipython的详细教程
2021/06/22 Python
python实现简单聊天功能
2021/07/07 Python
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技