es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo renderizar condicionalmente el color de mi componente según la prop?

El color de mi componente cambia según el valor de la propiedad ‘level’. Cuando intenté usar estados para establecer el backgroundColor me di cuenta de que todos los componentes tienen el mismo color ya que el estado sigue cambiando para cada comentario. Intenté usar referencias y estados para resolver esto, sin embargo, no he podido solucionar el problema ya que el código parece funcionar de la misma manera. Cualquier ayuda sería genial, gracias.

function CommentMargin({level}) {

    const [marginColorState, setMarginColorState] = useState(colors.lightPurple);
    const marginColor = useRef(null);

    useEffect(() => {   
        switch (level) {
            case 1:
                setMarginColorState(colors.lightPurple);
                marginColor.current = marginColorState;
                break;
            case 2:
                setMarginColorState(colors.crimson);
                marginColor.current = marginColorState;
                break;
            case 3:
                setMarginColorState(colors.orange);
                marginColor.current = marginColorState;
                break;
            case 4:
                setMarginColorState(colors.yellow);
                marginColor.current = marginColorState;
                break;
        }
    });

    return (
        <view style="{styles(marginColor).container}"></view>
    );
}

export default CommentMargin;

const styles = (marginColor) => StyleSheet.create({
    container: {
        backgroundColor: marginColor.current,
    }
});
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código anterior es que el gancho useRef se utiliza para asignar el valor de marginColor al estilo backgroundColor, pero marginColor no se establece realmente. Solo se pasa como parámetro a styles.

    En lugar de usar el gancho useRef, puedes establecer directamente el valor del estilo backgroundColor utilizando la variable de estado marginColorState. También puedes agregar una declaración de interrupción en cada caso de interruptor para asegurarte de que se ejecute solo un caso.

    Aquí tienes cómo puedes actualizar el código:

    function CommentMargin({level}) {
    
        const [marginColorState, setMarginColorState] = useState(colors.lightPurple);
    
        useEffect(() => {   
            switch (level) {
                case 1:
                    setMarginColorState(colors.lightPurple);
                    break;
                case 2:
                    setMarginColorState(colors.crimson);
                    break;
                case 3:
                    setMarginColorState(colors.orange);
                    break;
                case 4:
                    setMarginColorState(colors.yellow);
                    break;
                default:
                    setMarginColorState(colors.lightPurple);
                    break;
            }
        }, [level]);
    
        return (
            <view style="{styles.container(marginColorState)}">
    
            </view>
        );
    }
    
    export default CommentMargin;
    
    const styles = StyleSheet.create({
        container: (marginColor) => ({
            backgroundColor: marginColor,
        }),
    });
    

    Este código utiliza el gancho useEffect para ejecutar la instrucción switch cada vez que cambia el valor de level. El valor de marginColorState se actualiza según la propiedad level, y este valor actualizado se pasa directamente al estilo backgroundColor mediante la inclusión de marginColorState en el objeto styles.

    Ten en cuenta que también se agrega un caso predeterminado a la instrucción switch en caso de que level tenga un valor que no sea manejado por ninguno de los casos.

Comments are closed.