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 相关文章推荐
IE6下focus与blur错乱的解决方案
Jul 31 Javascript
实例讲解javascript注册事件处理函数
Jan 09 Javascript
关于验证码在IE中不刷新的快速解决方法
Sep 23 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
Feb 06 Javascript
JS动态修改网页body的背景色实例代码
Oct 07 Javascript
详解Vue快速零配置的打包工具——parcel
Jan 16 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
Jun 14 Javascript
细说Vue组件的服务器端渲染的过程
May 30 Javascript
vue实现跳转接口push 转场动画示例
Nov 01 Javascript
JavaScript随机数的组合问题案例分析
May 16 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
Jun 16 Javascript
springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)
Oct 15 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筛选不存在的图片资源
2015/04/28 PHP
基于PHP实现等比压缩图片大小
2016/03/04 PHP
javascript实现仿银行密码输入框效果的代码
2007/12/13 Javascript
javascript 写类方式之七
2009/07/05 Javascript
javascript 弹出窗口中是否显示地址栏的实现代码
2011/04/14 Javascript
读jQuery之二(两种扩展)
2011/06/11 Javascript
jQuery写的日历(包括日历的样式及功能)
2013/04/23 Javascript
jquery属性选择器not has怎么写 行悬停高亮显示
2013/11/13 Javascript
jQuery不兼容input的change事件问题解决过程
2014/12/05 Javascript
vue父组件通过props如何向子组件传递方法详解
2017/08/16 Javascript
Angular实现可删除并计算总金额的购物车功能示例
2017/12/26 Javascript
webpack-dev-server自动更新页面方法
2018/02/22 Javascript
Vue 仿QQ左滑删除组件功能
2018/03/12 Javascript
element vue validate验证名称重复 输入框与后台重复验证 特殊字符 字符长度 及注意事项小结【实例代码】
2018/11/20 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
javascript设计模式 ? 迭代器模式原理与用法实例分析
2020/04/17 Javascript
javascript解析json格式的数据方法详解
2020/08/07 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
javascript实现拼图游戏
2021/01/29 Javascript
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
python字典的常用操作方法小结
2016/05/16 Python
python程序中的线程操作 concurrent模块使用详解
2019/09/23 Python
python pygame实现球球大作战
2019/11/25 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
加拿大领先的优质厨具产品在线购物网站:Golda’s Kitchen
2017/11/17 全球购物
小橄榄树:Le Petit Olivier
2018/04/23 全球购物
全球独特生活方式产品和礼品购物网站:AHAlife
2018/09/18 全球购物
人资专员岗位职责
2014/04/04 职场文书
啦啦队口号大全
2014/06/16 职场文书
房屋授权委托书范本
2014/10/07 职场文书
谢师宴学生致辞
2015/07/27 职场文书
2016年三八红旗手先进事迹材料
2016/02/26 职场文书
经典《舰娘》游改全新动画预告 预定11月开播
2022/04/01 日漫
Golang 对es的操作实例
2022/04/20 Golang