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 相关文章推荐
推荐dojo学习笔记
Mar 24 Javascript
javascript中onmouse事件在div中失效问题的解决方法
Jan 09 Javascript
鼠标选择动态改变网页背景颜色的JS代码
Dec 10 Javascript
20条学习javascript的编程规范的建议
Nov 28 Javascript
JavaScript学习笔记之JS对象
Jan 22 Javascript
运用js教你轻松制作html音乐播放器
Apr 17 Javascript
js判断iframe中元素是否存在的实现代码
Dec 24 Javascript
Vue单文件组件基础模板小结
Aug 10 Javascript
深入理解Angular4订阅(Subscribe)与取消
Nov 22 Javascript
node内置调试方法总结
Feb 22 Javascript
JavaScript DOM元素常见操作详解【添加、删除、修改等】
May 09 Javascript
JS如何把字符串转换成json
Feb 21 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开发文件系统实例讲解
2006/10/09 PHP
fleaphp crud操作之find函数的使用方法
2011/04/23 PHP
php+js iframe实现上传头像界面无跳转
2014/04/29 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
jquery的总体架构分析及实现示例详解
2014/11/08 Javascript
JavaScript异步加载问题总结
2018/02/17 Javascript
vue组件tabbar使用方法详解
2018/11/06 Javascript
JS闭包原理与应用经典示例
2018/12/20 Javascript
mpvue全局引入sass文件的方法步骤
2019/03/06 Javascript
vue微信分享的实现(在当前页面分享其他页面)
2019/04/16 Javascript
vue控制多行文字展开收起的实现示例
2019/10/11 Javascript
js+css实现全屏侧边栏
2020/06/16 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
[52:07]完美世界DOTA2联赛PWL S3 LBZS vs access 第二场 12.10
2020/12/13 DOTA
[31:29]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第一场 12.20
2020/12/23 DOTA
Python多进程机制实例详解
2015/07/02 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
Python学习笔记之open()函数打开文件路径报错问题
2018/04/28 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
2019/05/15 Python
python实现共轭梯度法
2019/07/03 Python
python如何使用jt400.jar包代码实例
2019/12/20 Python
OpenCV python sklearn随机超参数搜索的实现
2020/01/17 Python
keras 实现轻量级网络ShuffleNet教程
2020/06/19 Python
python 用struct模块解决黏包问题
2020/11/07 Python
英国精品买手店:Browns Fashion
2016/09/29 全球购物
萨克斯第五大道精品百货店: Saks Fifth Avenue
2017/04/28 全球购物
罗技美国官网:Logitech美国
2020/01/22 全球购物
迪卡侬印尼体育用品商店:Decathlon印尼
2020/03/11 全球购物
EJB3.1都有哪些改进
2012/11/17 面试题
高考备战决心书
2014/03/11 职场文书
2014年五一劳动节社区活动总结
2014/04/14 职场文书
幼儿园感恩节活动方案2014
2014/10/11 职场文书
党风廉政建设调研报告
2015/01/01 职场文书
2015年留守儿童工作总结
2015/05/22 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书