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 相关文章推荐
js自带函数备忘 数组
Dec 29 Javascript
用Div仿showModalDialog模式菜单的效果的代码
Mar 05 Javascript
Jquery cookie操作代码
Mar 14 Javascript
jQuery+jqmodal弹出窗口实现代码分明
Jun 14 Javascript
js+div实现图片滚动效果代码
Feb 10 Javascript
ajax请求乱码的解决方法(中文乱码)
Apr 10 Javascript
jQuery EasyUI window窗口使用实例代码
Dec 25 jQuery
JS对象与json字符串相互转换实现方法示例
Jun 14 Javascript
微信小程序动态添加view组件的实例代码
May 23 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
Aug 21 Javascript
vue中实现动态生成二维码的方法
Feb 21 Javascript
arcgis.js控制地图地体的显示范围超出区域自动弹回(实现思路)
Jan 28 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
php的array_multisort()使用方法介绍
2012/05/16 PHP
php中sprintf与printf函数用法区别解析
2014/02/17 PHP
php通过字符串调用函数示例
2014/03/02 PHP
php设计模式之命令模式使用示例
2014/03/02 PHP
php文件服务实现虚拟挂载其他目录示例
2014/04/17 PHP
php将金额数字转化为中文大写
2015/07/09 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
2017/06/17 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
PHP钩子实现方法解析
2019/05/21 PHP
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
javascript中键盘事件用法实例分析
2015/01/30 Javascript
JavaScript中的Math.E属性使用详解
2015/06/12 Javascript
Javascript 事件冒泡机制详细介绍
2016/10/10 Javascript
从零学习node.js之mysql数据库的操作(五)
2017/02/24 Javascript
jQuery插件echarts实现的多柱子柱状图效果示例【附demo源码下载】
2017/03/04 Javascript
bootstrap弹出层的多种触发方式
2017/05/10 Javascript
利用Angular.js编写公共提示模块的方法教程
2017/05/28 Javascript
详解Vue中localstorage和sessionstorage的使用
2017/12/22 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
2019/01/24 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
浅谈js中的attributes和Attribute的用法与区别
2020/07/16 Javascript
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
Python的爬虫程序编写框架Scrapy入门学习教程
2016/07/02 Python
浅述python中深浅拷贝原理
2018/09/18 Python
python读取csv和txt数据转换成向量的实例
2019/02/12 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
2019/10/30 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
Python3中FuzzyWuzzy库实例用法
2020/11/18 Python
HTML5的文档结构和新增标签完全解析
2017/04/21 HTML / CSS
html如何对span设置宽度
2019/10/30 HTML / CSS
雅萌 (YA-MAN) :日本美容家电领域的龙头企业
2017/05/12 全球购物
万豪国际住宅与别墅集团:Homes & Villas by Marriott International
2020/10/08 全球购物
教师师德师风自我剖析材料
2014/09/29 职场文书
教师个人培训总结
2015/02/11 职场文书
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
2021/04/05 MySQL