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 构造函数 实例分析
Nov 26 Javascript
菜鸟javascript基础整理1
Dec 06 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
Apr 12 Javascript
JavaScript Array对象详解
Mar 01 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
Mar 30 Javascript
JavaScript实现解析INI文件内容的方法
Nov 17 Javascript
Bootstrap警告(Alerts)的实现方法
Mar 22 Javascript
angular过滤器实现排序功能
Jun 27 Javascript
vue中axios实现数据交互与跨域问题
May 12 Javascript
JS中的算法与数据结构之字典(Dictionary)实例详解
Aug 20 Javascript
浅谈Vue 自动化部署打包上线
Jun 14 Javascript
使用vue实现通过变量动态拼接url
Jul 22 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
一个可以找出源代码中所有中文的工具
2006/10/25 PHP
php设计模式 Proxy (代理模式)
2011/06/26 PHP
探讨Hessian在PHP中的使用分析
2013/06/13 PHP
php对称加密算法示例
2014/05/07 PHP
Codeigniter出现错误提示Error with CACHE directory的解决方案
2014/06/12 PHP
laravel与thinkphp之间的区别与优缺点
2021/03/02 PHP
网页设计常用的一些技巧
2006/12/22 Javascript
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
javascript中字符串的定义示例代码
2013/12/19 Javascript
jQuery对Select的操作大集合(收藏)
2013/12/28 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
2015/03/02 Javascript
JavaScript多线程详解
2015/08/12 Javascript
JS实现的最简Table选项卡效果
2015/10/14 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
2016/11/24 Javascript
AngularJS 获取ng-repeat动态生成的ng-model值实例详解
2016/11/29 Javascript
Angular.JS中的this指向详解
2017/05/17 Javascript
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
NodeJs form-data格式传输文件的方法
2017/12/13 NodeJs
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
2017/12/26 Javascript
vue动态路由配置及路由传参的方式
2018/05/23 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
如何利用Node.js与JSON搭建简单的动态服务器
2020/06/16 Javascript
Python生成随机MAC地址
2015/03/10 Python
python实现根据ip地址反向查找主机名称的方法
2015/04/29 Python
Python标准库之collections包的使用教程
2017/04/27 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
Python嵌入C/C++进行开发详解
2020/06/09 Python
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
维多利亚的秘密阿联酋官网:Victoria’s Secret阿联酋
2019/12/07 全球购物
迟到检讨书800字
2014/01/13 职场文书
调研汇报材料范文
2014/08/17 职场文书
个人学习群众路线心得体会
2014/11/05 职场文书
小学教师见习总结
2015/06/23 职场文书
新闻发布会新闻稿
2015/07/17 职场文书
2015年中学团委工作总结
2015/07/22 职场文书