以形式证明可重复使用的反应组件
React应用的基石是组件。几乎不可能构建一个React应用而不用到组件。组件的广泛应用甚至导致一些第三方包提供可用于集成功能的组件。
这些第三方组件通常是可重用的。它们与您应用中可能已有的组件之间的区别在于特异性。
我的意思是:假设您经营一家销售Polo衫的公司,您可以这样做:
- 生产已经印有图案的Polo衫,或者
- 让买家选择他们想要的图案。
一些基本要素会保持一致,例如所有Polo衫都应该是短袖的。但用户可以选择衬衫的不同款式,例如颜色和尺寸。在这种情况下,短袖Polo衫就是一个很好的React组件:它是一个具有不同变化的相同商品。
现在假设您正在开发一个登录表单。与Polo衫一样,表单具有一致的特征,但我们关注的不是尺寸和颜色变化,而是输入字段、提交按钮,甚至可能是忘记密码链接。这可以组件化并实现输入、按钮、链接等的各种变化。
输入元素示例
让我们从为表单创建输入字段的角度来看。典型的文本输入在React组件中如下所示:
class Form extends React.Component { constructor(props) { super(props); this.state = { username: '' }; } handleChange = (event) => { this.setState({ username: event.target.value }); }; render() { return (); } }
为了使此输入元素可在其他地方和项目中重用,我们必须将其提取到其自己的组件中。让我们将其命名为FormInput。
import React from 'react'; import PropTypes from 'prop-types'; const FormInput = ({ name, type, placeholder, onChange, className, value, error, children, label, ...props }) => { return ( <div> <label htmlfor="{name}">{label}</label> <input type="{type}" name="{name}" placeholder="{placeholder}" onchange="{onChange}" classname="{className}" value="{value}"> {error && <p>{error}</p>} </div> ); }; FormInput.defaultProps = { type: "text", className: "" }; FormInput.propTypes = { name: PropTypes.string.isRequired, type: PropTypes.oneOf(['text', 'number', 'password']), placeholder: PropTypes.string.isRequired, className: PropTypes.string, value: PropTypes.any, onChange: PropTypes.func.isRequired, label: PropTypes.string.isRequired // Added required label prop }; export default FormInput;
该组件接受某些props,例如我们需要使用有效标记创建输入所需的属性,包括占位符、值和名称。我们在render函数中设置输入元素,并将属性值设置为传递给组件的props。我们甚至将输入绑定到标签以确保它们始终在一起。您可以看到我们没有通过预定义任何内容来做出假设。我们的目标是确保该组件可以在尽可能多的场景中使用。
这构成了一个很好的组件,因为它强制执行良好的标记(Brad Frost 称之为“dumb React”),这表明并非每个组件都必须是某种高度复杂的功能。话虽如此,如果我们谈论的是一些非常基本的东西,比如静态标题,那么使用React组件可能就有点矫枉过正了。将某些东西制作为可重用组件的可能标准可能是当您需要在应用程序的其他部分使用相同的功能时。如果该组件只使用一次,则通常不需要“可重用”组件。
我们可以在另一个组件LoginPage中使用我们的输入组件。
import React, { Component } from 'react'; import FormInput from './FormInput'; // Import FormInput component class LoginPage extends Component { state = { user: { username: "", password: "" }, errors: {}, submitted: false }; handleChange = event => { const { user } = this.state; user[event.target.name] = event.target.value; this.setState({ user }); }; onSubmit = (event) => { event.preventDefault(); // Prevent default form submission const { user } = this.state; let errors = {}; if (!user.username) { errors.username = "Enter your username!"; } if (user.password.length {submitted ? ( <p>Welcome onboard, {user.username}!</p> ) : ( <div> <h3>Login!</h3> <forminput name="username" label="Username" placeholder="Enter your username" value="{user.username}" onchange="{this.handleChange}" error="{errors.username}"></forminput> <forminput name="password" type="password" label="Password" placeholder="Enter your password" value="{user.password}" onchange="{this.handleChange}" error="{errors.password}"></forminput> <button type="submit">Login</button> </div> )} ); } } export default LoginPage;
看到LoginPage如何两次使用FormInput了吗?我们同时将其用作用户名和密码的文本输入。如果我们想更改输入的功能,我们可以在我们创建的FormInput组件文件中进行这些更改,并且这些更改将应用于使用输入组件的每个实例。这就是拥有可重用组件的基本优势:您不必重复自己。
甚至错误也是从FormInput组件显示的。
onSubmit函数首先验证我们从表单中获得的用户对象,确保它符合用户名有值的结构。请注意,我们甚至可以扩展输入的功能,就像我们所做的那样,检查密码是否包含至少八个字符。
如果您查看代码,您会看到其中有一个Button组件。这与HTML元素不同,而是一个其他组件,它采用定义我们想要的按钮类型(提交、重置、按钮)、其类名、单击时要执行的操作以及标签的props。我们可以集成许多其他按钮属性来强制执行所需的任何标准。
const Button = ({ type, className, onClick, label, ...props }) => ( <button type="{type}" classname="{className}" onclick="{onClick}"> {label} </button> ); export default Button;
这是将所有组件组合在一起后的最终登录表单。
想自己试试吗?尝试使用可重用的<input>
元素。如果这太难,您可以从<input>
元素开始,然后可能是一个复选框,然后再跳到<select></select>
。关键思想是使其通用。我很想看看您的成果,所以请在评论区链接您的作品!
以上是以形式证明可重复使用的反应组件的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undress AI Tool
免费脱衣服图片

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

不同浏览器对CSS解析存在差异,导致显示效果不一致,主要包括默认样式差异、盒模型计算方式、Flexbox和Grid布局支持程度及某些CSS属性行为不一致。1.默认样式处理不一致,解决方法是使用CSSReset或Normalize.css统一初始样式;2.旧版IE的盒模型计算方式不同,建议统一使用box-sizing:border-box;3.Flexbox和Grid在边缘情况或旧版本中表现有差异,应多测试并使用Autoprefixer;4.某些CSS属性行为不一致,需查阅CanIuse并提供降级

要使用CSS创建响应式图片,主要可通过以下方法实现:1.使用max-width:100%和height:auto让图片在保持比例的同时自适应容器宽度;2.结合HTML的srcset和sizes属性智能加载适配不同屏幕的图片源;3.利用object-fit和object-position控制图片裁剪与焦点展示。这些方法共同确保图片在不同设备上清晰、美观地呈现。

opacity是CSS中用于控制元素整体透明度的属性,取值范围为0(完全透明)到1(完全不透明)。1.常用于图片hover淡出效果,通过设置opacity过渡增强交互体验;2.制作背景遮罩层提升文字可读性;3.控制按钮或图标在禁用状态下的视觉反馈。需注意它会影响所有子元素,且与rgba不同,后者仅影响指定颜色部分。搭配transition可实现平滑动画,但频繁使用可能影响性能,建议结合will-change或transform使用。合理应用opacity能增强页面层次感和交互性,但应避免干扰用户

accent-color是CSS中用于自定义复选框、单选按钮和滑块等表单元素高亮颜色的属性;1.它直接改变表单控件选中状态的默认颜色,如将复选框的蓝色勾选标记改为红色;2.支持的元素包括type="checkbox"、type="radio"和type="range"的输入框;3.使用accent-color可避免复杂的自定义样式和额外DOM结构,保持原生可访问性;4.现代浏览器普遍支持,旧浏览器需降级处理;5.设置accent-col

The:has()pseudo-classinCSSallowstargetingaparentelementbasedonitschildelements.Itworksbyusingthesyntaxparent:has(child-selector)toapplystylesconditionally.Forexample,div:has(img)appliesstylestoadivcontaininganimage.Multipleselectorscanbeusedwithcomma

浏览器默认样式通过自动应用边距、填充、字体和表单元素样式确保基本可读性,但可能导致跨浏览器布局不一致。1.默认外边距和填充改变布局流,如标题、段落和列表自带间距;2.默认字体设置影响可读性,如16px字号和TimesNewRoman字体;3.表单元素在不同浏览器显示差异大,需重置外观;4.某些标签如strong和em有默认强调样式,需显式覆盖。解决方法包括使用Normalize.css、重置样式或全局清除边距与填充,同时自定义字体和表单样式以保证一致性。

要美化段落开头提升视觉吸引力,常见做法是使用CSS的伪元素或手动设置文档样式。网页开发中可用p::first-letter设置首字母样式,如放大、加粗、变色,但需注意仅适用于块级元素;若想突出整段首行,则用p::first-line来加样式;在Word等文档软件中可手动调整首字母格式或创建样式模板,而InDesign有内置“首字下沉”功能适合出版设计;应用时需注意细节,如避免复杂样式影响阅读、确保兼容性和格式一致性。

使用CSS的::selection伪元素可自定义网页文字选中时的高亮样式,提升页面美观与统一性。1.基础设置:通过::selection定义background-color与color,如黄色背景配深灰字体;也可限定特定元素如p::selection。2.兼容处理:添加-webkit-前缀以兼容Safari及移动端浏览器,Firefox和Edge标准支持良好。3.注意可读性:避免颜色对比过强或过于花哨,应与整体设计协调,例如深色模式下选用柔和蓝底提升视觉舒适度。合理运用可增强界面质感,忽略细节则
