React styled-components(二)—— props、attrs属性

news/2024/10/17 6:27:36/

styled-components props、attrs属性

  • `props`
    • `props` 穿透
    • 添加 `attrs` 属性
    • 获取 `state` 中的样式
  • 变量控制样式
    • 通过 `props` 控制样式
    • 通过 `css` 控制样式

props

props 穿透

styled-components 可以 props 穿透,把属性穿透到元素中。

通常,用 cssinput 组件实现一个密码输入框写法如下:

<input type="password" />

接下来用 styled-components 来实现,首先生成一个 input组件,新建 Demo.js 文件:

import React, { Component } from 'react'
import styled from 'styled-components';const ContextBox = styled.div`width: 800px;height: 200px;margin: 20px auto;
`const ContextP = styled.input`font-size: 20px;
`class Home extends Component {render () {return (<ContextBox><ContextP></ContextP></ContextBox>)}
}
export default Home

App.js 中引入 Demo.js 文件:

// import logo from './assets/images/logo.svg';
import './assets/css/App.css';
import Demo from './components/Demo'function App () {return (<div className="App"><header className="App-header">{/* <img src={logo} className="App-logo" alt="logo" /> */}<p>文字 <code>src/App.js</code> Hello World!.</p><aclassName="App-link"href="https://reactjs.org"target="_blank"rel="noopener noreferrer">https://reactjs.org</a></header><Demo /></div>);
}export default App;

页面效果:
在这里插入图片描述

接下来,给生成的 ContextP 组件添加 type=password,将属性穿透到 input 元素中:

<ContextP type="password"></ContextP>

页面效果:
在这里插入图片描述

添加 attrs 属性

添加 attrs 属性。attrs 是个函数,可以进行调用,返回值也是一个函数,后面可以继续调用。

修改 Demo.js 文件:

import React, { Component } from 'react'
import styled from 'styled-components';const ContextBox = styled.div`width: 800px;height: 200px;margin: 20px auto;
`const ContextP = styled.input.attrs({// 定义静态 propsplaceholder: '请输入内容',txtColor: 'blue',bColor: 'red',// 没传默认使用 1emmargin: props => props.size || '1em',padding: props => props.size || '1em'
})`
border-color: ${props => props.bColor};
color: ${props => props.txtColor};
`class Home extends Component {render () {return (<ContextBox><ContextP ></ContextP><ContextP size='2em'></ContextP></ContextBox>)}
}
export default Home

页面效果:
在这里插入图片描述

有时候可能需要用到第三方库样式,可以使用这个方法轻松达到。

获取 state 中的样式

也可以获取 state 中的样式,修改 <ContextP size='2em'></ContextP> 代码为如下:

<ContextP size={this.state.size}/>

在组件中写的属性 size={this.state.size}attrs 函数中写的属性会结合起来传递到 props 中。

变量控制样式

通过 props 控制样式

props 可以被传递到 styled 组件。

获取 props 需要通过 ${} 传入一个插值函数,props 会作为该函数的参数,这种方式可以有效的解决动态样式的问题。

修改 Demo.js 文件:

import React, { Component } from 'react'
import styled from 'styled-components';const ContextBox = styled.div`width: 800px;height: 100px;margin: 0 auto;p {color: yellow;background: ${props => props.primary ? 'palevioletred' : 'orange'};color: ${props => props.primary ? 'white' : 'black'};}
`class Home extends Component {render () {return (<div><ContextBox ><p >Hello World, this is my first styled component!</p></ContextBox><ContextBox primary><p >Hello World, this is my first styled component!</p></ContextBox></div>)}
}
export default Home

页面效果:
在这里插入图片描述

通过 css 控制样式

修改Demo.js 文件:

import React, { Component } from 'react'
import styled, { css } from 'styled-components';const CustomStyle = styled.div`p {     color: red;}
`const ContextBox = styled(CustomStyle)`
${({ num, color }) => css`width: 800px;height: 200px;margin: 0 auto;background: ${color};span {color: yellow;font-size: ${num}px;}
`}`class Home extends Component {render () {return (<div><ContextBox num={20} color="grey"><p>Hello World, this is my first styled component!</p><p>11111111111</p><p>22222222222</p><p>33333333333</p><span>This is a span!</span></ContextBox></div>)}
}
export default Home

页面效果:
在这里插入图片描述


http://www.ppmy.cn/news/47302.html

相关文章

一文了解Gralde

&#x1f3e0;个人主页&#xff1a;shark-Gao &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是shark-Gao&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f389;目前状况&#xff1a;23届毕业生&#xff0c;目前在某公司实习&#x1f…

自动驾驶就是在扯?比亚迪你凭什么?

比亚迪“炮轰”自动驾驶 上周&#xff0c;在比亚迪2022年财报交流会上&#xff0c;有投资人问比亚迪在自动驾驶方面的发展进度和规划&#xff0c;比亚迪集团董事长王传福直言&#xff1a;“无人驾驶那都是扯淡&#xff0c;弄个虚头巴脑的东西那都是忽悠&#xff0c;它就是一场皇…

Harmony OS 开发指南——源码下载和编译

本文介绍了如何下载鸿蒙系统源码&#xff0c;如何一次性配置可以编译三个目标平台&#xff08;Hi3516&#xff0c;Hi3518和Hi3861&#xff09;的编译环境&#xff0c;以及如何将源码编译为三个目标平台的二进制文件。 坑点总结&#xff1a; 下载源码基本上没有太多坑&#xf…

【添砖Java】java的运算符、注释与关键字

文章目录 运算符算术运算符关系运算符逻辑运算符位运算符移位运算符条件运算符 注释基本规则注释规范 关键字 运算符 算术运算符 基本四则运算符&#xff1a;&#xff08;加&#xff09;、-&#xff08;减&#xff09;、*&#xff08;乘&#xff09;、/&#xff08;除&#x…

ChatGPT实战100例 - (05) ChatGPT 结合 Mermaid 的 Gantt 图表示

文章目录 ChatGPT实战100例 - (05) ChatGPT 结合 Mermaid 的 Gantt 图表示一、需求与思路二、辨析概念三、图形展示四、总结1. 为什么不使用PlantUML&#xff1f;2. Gantt图是这样用的么&#xff1f;3. Gantt图的主要使用场景&#xff1f; ChatGPT实战100例 - (05) ChatGPT 结合…

「数据库、数据库连接池、数据源」这些概念你真的理解了吗?

前言 我学习的过程中&#xff0c;对于连接池和数据源分得不是很清楚&#xff0c;而且我发现有的人将数据库等同于数据源&#xff0c;或者将数据源等同于连接池&#xff0c;实际上这些说法并不准确。 在某次工作中&#xff0c;同事 A 说道&#xff0c;这个数据源不行&#xff0…

常见分布式锁4:zookeeper 瞬时znode节点 + watcher监听机制,ChatGPT回复的解决死锁的方案

原文地址在这里 临时节点具备数据自动删除的功能。当client与ZooKeeper连接和session断掉时&#xff0c;相应的临时节点就会被删除。zk有瞬时和持久节点&#xff0c;瞬时节点不可以有子节点。会话结束之后瞬时节点就会消失&#xff0c;基于zk的瞬时有序节点实现分布式锁&#x…

科技云报到:存储开源,风雨飘摇下“披着羊皮的狼”?

科技云报道原创。 这些年开源界的风风雨雨&#xff0c;时不时撼动着人们的内心。 2022年&#xff0c;俄乌冲突导致全球最大的独立开源软件公司SUSE、美国开源软件巨头Redhat、主流开源容器引擎Docker&#xff0c;纷纷宣布停止与俄罗斯的合作。 而全球最大的开源及私有代码项目…