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分页控件 可用于无刷新分页
Jul 23 Javascript
正负小数点后两位浮点数实现原理及代码
Sep 06 Javascript
JS实现的4种数字千位符格式化方法分享
Mar 02 Javascript
第九章之路径分页标签与徽章组件
Apr 25 Javascript
关于验证码在IE中不刷新的快速解决方法
Sep 23 Javascript
最通俗易懂的javascript变量提升详解
Aug 05 Javascript
js数组常用最重要的方法
Feb 04 Javascript
记一次webapck4 配置文件无效的解决历程
Sep 19 Javascript
Vue 请求传公共参数的操作
Jul 31 Javascript
微信小程序中target和currentTarget的区别小结
Nov 06 Javascript
Ajax 的初步实现(使用vscode+node.js+express框架)
Jun 18 Javascript
JavaScript选择器函数querySelector和querySelectorAll
Nov 27 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
php动态生成函数示例
2014/03/21 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
2014/04/01 PHP
PHP串行化与反串行化实例分析
2016/12/27 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
2020/05/14 PHP
Javascript 跨域访问解决方案
2009/02/14 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
2012/01/13 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
2016/01/23 Javascript
浅谈Angularjs link和compile的使用区别
2016/10/21 Javascript
js仿微信语音播放实现思路
2016/12/12 Javascript
JavaScript之浏览器对象_动力节点Java学院整理
2017/07/03 Javascript
Js自定义多选框效果的实例代码
2017/07/05 Javascript
分享Bootstrap简单表格、表单、登录页面
2017/08/04 Javascript
详解Js中的模块化是如何实现的
2017/10/18 Javascript
Angular实现下拉框模糊查询功能示例
2018/01/03 Javascript
解决vue-quill-editor上传内容由于图片是base64的导致字符太长的问题
2018/08/20 Javascript
3分钟了解vue数据劫持的原理实现
2019/05/01 Javascript
JS学习笔记之原型链和利用原型实现继承详解
2019/05/29 Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
2019/07/15 Javascript
简单谈谈javascript高级特性
2019/09/04 Javascript
javascript设计模式 ? 原型模式原理与应用实例分析
2020/04/10 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
python使用chardet判断字符串编码的方法
2015/03/13 Python
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
python集合是否可变总结
2019/06/20 Python
Python3内置模块random随机方法小结
2019/07/13 Python
python django 原生sql 获取数据的例子
2019/08/14 Python
python字符串的拼接方法总结
2019/11/18 Python
Python+numpy实现矩阵的行列扩展方式
2019/11/29 Python
浅析python表达式4+0.5值的数据类型
2020/02/26 Python
CSS3 文字动画效果
2020/11/12 HTML / CSS
美国奢侈品购物平台:Orchard Mile
2018/05/02 全球购物
解约证明模板
2015/06/19 职场文书
Java9新特性之Module模块化编程示例演绎
2022/03/16 Java/Android