【问题标题】:Changing a Component inside another Component/react-icons在另一个组件/react-icons 中更改组件
【发布时间】:2021-03-29 13:07:10
【问题描述】:

我正在构建一个评级组件,它接收许多图标并使用react-icons 显示它们。然而,我的问题是关于我想实现的功能。目前,我使用的反应图标是FaStarhalf,它是一个预填充的半星,我翻转它以制造我创造了半星的错觉。这很容易使用,并且可以完成我需要它做的事情,但是,我想实现一种更好的方式来在您选择星星时进行显示。不幸的是,react-icons 似乎没有能力让我一直填充图标。 FaRegStarHalf 是 react-icons 的另一个组件,它基本上是一个星星的剪裁,但是,你不能填充它。

所以我的问题给你。是否有可能在我的FaStarHalf 组件中单击它时将每个FaStarHalf 更改为react-icons 的填充对应项?我可以将组件从自身内部更改为不同的组件吗?

Rater

import React, { useState } from 'react'
import { FaStarHalf } from 'react-icons/fa'

import './styles/Rater.css'

const Rater = ({ iconCount }) => {
    const [rating, setRating] = useState(null)
    const [hover, setHover] = useState(null)
    return (
        <div>
            {[...Array(iconCount), ...Array(iconCount)].map((icon, i) => {
                const value = (i + 1) / 2

                return (
                    <label>
                        <input
                            type='radio'
                            name='rating'
                            value={value}
                            onClick={() => {
                                console.log(`value => `, value)
                                return setRating(value)
                            }}
                        />
                        <div className='star-container'>
                            <div>
                                <FaStarHalf
                                    className={i % 2 ? 'star-left' : 'star'}
                                    color={value <= (hover || rating) ? '#ffc107' : '#e4e5e9'}
                                    onMouseEnter={() => setHover(value)}
                                    onMouseLeave={() => setHover(null)}
                                />
                            </div>
                        </div>
                    </label>
                )
            })}
        </div>
    )
}

export default Rater
FaHalfStar

FaRegHalfStar

【问题讨论】:

  • 弄清楚你想要什么有点令人困惑,但为什么不根据需要使用 react-icons 中的填充星呢? FaStar。因此,如果评级为 3.5 星,则显示 3 个 FaStar 图标和一个 FaHalfStar 图标。也许我误解了你遇到的问题?查看来自...Array(iconCount) 的数据可能会有所帮助。

标签: javascript css reactjs react-icons


【解决方案1】:

没有看到您正在处理的数据看起来像这样很难回答,但我会试一试。我假设您想要的是当用户单击星号以将评分设置在 1 到 5 之间时,您希望以实心星的形式向他们显示他们的评分。如果是这种情况,您可以使用rating 来确定是向用户显示当前评级还是他们设置的评级,然后根据需要使用适当的图标。

这可以通过将正确的字符串设置为变量然后使用它来代替您的图标 JSX 标记名称来完成。基本上,如果用户设置了评分,rating 将不再是null,您可以断言您需要填充星。使用该逻辑将变量分配给您想要的字符串。 const Star = rating ? 'FaStar' : 'FaHalfStar'

import React, { useState } from 'react'
import { FaStarHalf, FaStar } from 'react-icons/fa'

import './styles/Rater.css'

const Rater = ({ iconCount }) => {
    const [rating, setRating] = useState(null)
    const [hover, setHover] = useState(null)
    // check if user has set a rating by clicking a star and use rating to determine icons
    const Star = rating ? 'FaStar' : 'FaHalfStar'

return (
    <div>
        {[...Array(iconCount), ...Array(iconCount)].map((icon, i) => {
            const value = (i + 1) / 2              
            
            return (
                <label>
                    <input
                        type='radio'
                        name='rating'
                        value={value}
                        onClick={() => {
                            console.log(`value => `, value)
                            return setRating(value)
                        }}
                    />
                    <div className='star-container'>
                        <div>
                            // Use 'Star' variable here which is assigned 'FaStar' or 'FaHalfStar' and will display a half star or a full star
                            <Star
                                className={i % 2 ? 'star-left' : 'star'}
                                color={value <= (hover || rating) ? '#ffc107' : '#e4e5e9'}
                                onMouseEnter={() => setHover(value)}
                                onMouseLeave={() => setHover(null)}
                            />
                        </div>
                    </div>
                </label>
            )
        })}
    </div>
)
}

export default Rater
FaHalfStar

【讨论】:

  • 这类似于我正在寻找的答案。我想要的是,当你第一次翻过它们时,你会得到第二张图片,但是当你点击并做出选择时,它们会像第一张图片一样被填满。我运行了您的代码并且字符串值不起作用,但是当我将它们更改为文字 FaStar 时,它运行了,但是我的代码和您的代码之间没有任何变化。但是,我认为您正在寻找我正在寻找的东西,这对我有很大帮助
  • 我能够移动代码并找到解决方案
  • 很高兴您找到了解决方案。我拼凑了一支快速代码笔,以表明您可以根据状态更改标签类型codepen.io/choincstar/pen/vYXZjrY
【解决方案2】:

我能够弄清楚,使用与@CaseyC 使用的代码类似的代码,我需要找到对应的已填写的半星,而不是我尝试使用的全星

import React, { useState } from 'react'
import { FaRegStarHalf, FaStarHalf } from 'react-icons/fa'

import './styles/Rater.css'

const Rater = ({ iconCount }) => {
    const [rating, setRating] = useState(null)
    const [hover, setHover] = useState(null)
    // check if user has set a rating by clicking a star and use rating to determine icons
    const Star = rating ? FaStarHalf : FaRegStarHalf

    return (
        <div>
            {[...Array(iconCount), ...Array(iconCount)].map((icon, i) => {
                const value = (i + 1) / 2

                return (
                    <label>
                        <input
                            type='radio'
                            name='rating'
                            value={value}
                            onClick={() => {
                                console.log(`value => `, value)
                                return setRating(value)
                            }}
                        />
                        <div className='star-container'>
                            <div>
                                <Star
                                    className={i % 2 ? 'star-left' : 'star'}
                                    color={value <= (hover || rating) ? '#ffc107' : '#e4e5e9'}
                                    onMouseEnter={() => setHover(value)}
                                    onMouseLeave={() => setHover(null)}
                                />
                            </div>
                        </div>
                    </label>
                )
            })}
        </div>
    )
}

export default Rater

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-12
    • 2020-06-05
    • 1970-01-01
    • 2022-11-13
    • 2021-10-18
    • 2018-01-26
    • 1970-01-01
    • 2021-10-20
    相关资源
    最近更新 更多