ReactJS中如何让Clocks组件返回的多元素在同一行显示
问题
我在App.js的代码片段中遇到的问题与Clocks组件(而非Clock组件)的返回内容有关:
function App() { return ( <div> <section className="section"> <div className="box-main"> <div className="firstHalf"> <div className ="top-line"> <Clock></Clock><Quotes></Quotes> </div> <div className = "worldClocks"> <div><Clocks></Clocks></div> </div>
worldClocks.js中的Clocks组件用于计算各时区的日期和时间,会在页面上生成各证券交易所的当前时间列表,目前是分行显示:
ASX(10): 11:52:25 am TSE(9:30): 10:52:25 am SSE(9:15): 9:52:25 am HKE(9:30): 9:52:25 am SGX(9:00): 9:52:25 am NSE(9:00): 7:22:25 am DIFX(10:00): 5:52:25 am RTS(9:30): 4:52:25 am JSE(9:30): 3:52:25 am FWB(9:30): 3:52:25 am LSE(8): 02:52:25 BM/F(10): 22:52:25 NYSE(9.30): 9:52:25 PM TXE(9.30): 9:52:25 PM
我尝试用App.scss中的CSS设置让它们显示在同一行,但没有效果,相关CSS代码如下:
.box-main { color: white; //text colour margin-left: 25px; } .firsthalf { min-width: 100%; display: flex; } .top-line { font-size: 1em; max-width: 100%; display: flex; align-content: space-between; gap: 30px; } .worldClocks { display: inline-flex; flex-direction: row; }
我推测Clocks组件是一次性返回所有内容而非逐个返回,想请教如何用CSS让这些时钟显示在同一行?能否通过函数传递CSS?这种场景下的最佳实践是什么?
附worldClocks.js代码:
import React from 'react'; //import * as ReactDOM from 'react-dom'; import { Component } from 'react'; // Timezone strings - https://en.wikipedia.org/wiki/List_of_tz_database_time_zones // Changed update setInterval to 30 seconds (30000) instead of every second (1000) class Clocks extends Component { constructor(props) { super(props); this.state = { date: new Date() }; this.updateDate = this.updateDate.bind(this); } componentDidMount() { this.interval = setInterval(this.updateDate, 30000); } componentWillUnmount() { clearInterval(this.interval); } updateDate() { this.setState({ date: new Date() }); } // Add all the world clocks wanted in here and in order of display render() { return ( <div> <div>{this.props.name}</div> <div> <Clock name="ASX(10): " date={this.state.date} country="en-AU" timeZone="Australia/Sydney" hour12="false" /> <Clock name="TSE(9:30): " date={this.state.date} country="en-AU" timeZone="Asia/Tokyo" hour12="false" //timeStyle="short" /> <Clock name="SSE(9:15): " date={this.state.date} country="en-AU" timeZone="Asia/Shanghai" hour12="false" //timeStyle="short" /> <Clock name="HKE(9:30): " date={this.state.date} country="en-AU" timeZone="Asia/Hong_Kong" hour12="false" /> <Clock name="SGX(9:00): " date={this.state.date} country="en-AU" timeZone="Asia/Singapore" hour12="false" /> <Clock name="NSE(9:00): " date={this.state.date} country="en-AU" timeZone="Asia/Kolkata" hour12="false" /> <Clock name="DIFX(10:00): " date={this.state.date} country="en-AU" timeZone="Asia/Dubai" hour12="false" /> <Clock name="RTS(9:30): " date={this.state.date} country="en-AU" timeZone="Europe/Moscow" hour12="false" /> <Clock name="JSE(9:30): " date={this.state.date} country="en-AU" timeZone="Africa/Johannesburg" hour12="false" /> <Clock name="FWB(9:30): " date={this.state.date} country="en-AU" timeZone="Europe/Berlin" hour12="false" /> <Clock name="LSE(8): " date={this.state.date} country="en-GB" timeZone="Europe/London" hour12="false" /> <Clock name="BM/F(10): " date={this.state.date} country="en-GB" timeZone="America/Sao_Paulo" hour12="false" /> <Clock name="NYSE(9.30): " date={this.state.date} country="en-US" timeZone="America/New_York" hour12="false" /> <Clock name="TXE(9.30): " date={this.state.date} country="en-US" timeZone="America/Toronto" hour12="false" /> </div> </div> ); } } class Clock extends React.Component { constructor(props) { super(props); this.state = { isHidden: true }; this.showClock = this.showClock.bind(this); } showClock() { this.setState({ isHidden: !this.state.isHidden }); } // This bit sends back the clock and the time render() { return ( <div> <div> {this.props.name} {this.props.date.toLocaleTimeString(this.props.country, {timeZone: this.props.timeZone})} </div> </div> ) } } //ReactDOM.render(<Clocks name="THE CLOCK" />, document.getElementById("root")); export default Clocks;
解决方案
一、CSS调整实现同行显示
问题核心是Clock组件的根元素是div(块级元素),默认独占一行,父容器的flex设置无法覆盖这个特性。可以通过以下两种方式修改:
方式1:直接修改Clock容器的显示属性
/* 让每个Clock项变成行内块元素 */ .worldClocks Clock, .worldClocks Clock > div { display: inline-block; margin-right: 20px; /* 可选:添加项间距 */ }
方式2:给Clocks内部的Clock包裹容器加flex布局
先给Clocks组件里包裹所有Clock的div添加className:
// 在Clocks的render方法中修改 <div className="clocks-container"> {/* 所有Clock组件 */} </div>
然后添加CSS:
.clocks-container { display: flex; gap: 20px; /* 用gap控制项间距,比margin更灵活 */ flex-wrap: wrap; /* 可选:超出容器宽度时自动换行 */ }
二、通过props传递CSS(组件样式自定义)
可以给Clock组件传递style或className props,让组件样式更灵活:
步骤1:修改Clock组件接收样式props
class Clock extends React.Component { render() { return ( <div style={this.props.style} className={this.props.className}> <div> {this.props.name} {this.props.date.toLocaleTimeString(this.props.country, {timeZone: this.props.timeZone})} </div> </div> ) } }
步骤2:调用Clock时传递样式
- 直接传行内样式:
<Clock name="ASX(10): " date={this.state.date} country="en-AU" timeZone="Australia/Sydney" hour12="false" style={{display: 'inline-block', marginRight: '20px'}} />
- 或者传自定义className:
<Clock // ...其他props className="clock-item" />
然后在CSS中定义:
.clock-item { display: inline-block; margin-right: 20px; }
三、场景最佳实践
- 组件结构优化:抽离数据循环渲染
把时钟数据抽成数组,循环渲染Clock组件,避免重复代码,提升可维护性:
// 在Clocks组件中定义数据数组 const clockData = [ {name: "ASX(10): ", country: "en-AU", timeZone: "Australia/Sydney"}, {name: "TSE(9:30): ", country: "en-AU", timeZone: "Asia/Tokyo"}, // ...其他时钟数据 ]; // 渲染时循环生成Clock <div className="clocks-container"> {clockData.map((item, index) => ( <Clock key={index} name={item.name} date={this.state.date} country={item.country} timeZone={item.timeZone} hour12="false" className="clock-item" /> ))} </div>
- 样式隔离:使用CSS Modules或CSS-in-JS
用CSS Modules或者styled-components可以避免全局样式污染,比如用styled-components:
import styled from 'styled-components'; const ClockItem = styled.div` display: inline-block; margin-right: 20px; color: inherit; `; // 在Clock组件中替换根div class Clock extends React.Component { render() { return ( <ClockItem> <div> {this.props.name} {this.props.date.toLocaleTimeString(this.props.country, {timeZone: this.props.timeZone})} </div> </ClockItem> ) } }
- 性能优化:避免不必要重渲染
用React.memo包裹Clock组件,减少非必要的重渲染:
const MemoizedClock = React.memo(Clock);
之后在Clocks组件中使用MemoizedClock替代原Clock组件即可。
内容的提问来源于stack exchange,提问作者mdkb
相关产品推荐
相关产品推荐

