Если оператор, который определяет, какой элемент React будет отображаться, странное поведение - PullRequest
0 голосов
/ 24 августа 2018

Я создал компонент Sprite, который принимает 'icon' в качестве реквизита и определяет, какой svg отображать, но у меня какое-то странное поведение.

Мне пришлось прибегнуть к этому методу, потому что у меня нетНе удалось найти способ работы с SVG (как изменить их цвет заливки!)

const Sprite: React.SFC<ISpriteProps> = (props: ISpriteProps) => {

const color = props.color || '#ACACAC'

let icon

if (props.icon === 'pin') {
    icon = <Pin color={color} />
} else if (
    props.icon === 'profile'
) {
    icon = <Profile color={color} />
}

return (
    <React.Fragment>
        {icon}
    </React.Fragment>
)

}

export default Sprite

Использование <Sprite/> в моем <Navigation/> компоненте, например,

<Nav styles={this.state.styles}>
    <ProfileIcon onClick={this.onProfileSelected}>
    <Sprite icon='profile' 
    color={this.state.viewing === 'profile' ? '#5A4DB2' : ''} />
    </ProfileIcon>
    <LogoIcon onClick={this.onLogoSelected}>
      <h1>
        <img src={logo} alt="zestly" />
      </h1>
    </LogoIcon>
    <MessagesIcon>
      <img src={chat} onClick={this.onMessageSelected} 
      alt="messages" />
    </MessagesIcon>
  </Nav>

и в моем <CardBlock/> компоненте, например, так:

const Card: React.SFC<{}> = (place) => {
  return (
    <CardOuter>
        <CardPhoto>
            <span>
                <Sprite icon='pin' color='#fff' />Fitzroy</span>
        </CardPhoto>
        <CardDetails>
            <div>
                <h3>Vegie bar</h3>
                <h4>7:00pm</h4>
            </div>
            <ProfileIcons />
        </CardDetails>
    </CardOuter>
  )
}

По какой-то причине значок, который я выбираю для передачи компоненту навигации Sprite, также определяет, что будет отображаться для Sprite в CardBlock.

Например, если я сделаю его «профилем» в Navigation, он заставит все спрайты отображать значок профиля для Sprite, даже если я специально передам «pin».Если я переключу его на 'pin' в Navigation, все спрайты CardBlock будут отображать значок булавки.

Я не понимаю, это какая-то странная реакция рендера React?

EDIT: Итак, яЯ подумал, что это как-то связано с рендерингом функциональных компонентов без сохранения состояния, поэтому я изменил Sprite на Component

class Sprite extends React.Component<ISpriteProps, {}> {
public render() {

    const color = this.props.color || '#ACACAC'


    const icons = {
        'profile': Profile,
        'pin': Pin
    }
    const ActiveIcon = icons[this.props.icon]


    return (
        <ActiveIcon color={color} />
    )
}
}

Все еще не люблю, он рендерит ВСЕ из них в виде значков профиля, если я передам 'profile' в качестве значка prop для Spriteв компоненте навигации.

РЕДАКТИРОВАТЬ: Решено.Это было что-то не так с svg's

1 Ответ

0 голосов
/ 24 августа 2018

вы можете использовать библиотеку классов, чтобы выбрать, какой класс должен быть добавлен к элементу React, включая svg.И в CSS вы даете правило заполнения, которое вы хотите.https://github.com/JedWatson/classnames

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...