Условное форматирование JSX при нажатии кнопки

У меня есть приложение, которое сначала показывает список автомобилей на основе реквизита, но нажатие кнопки sort преобразует дисплей в алфавитный список.

Я пытаюсь установить функцию, которая изменяет состояние buttonClicked каждый раз, когда нажимается кнопка sort (которая запускает sortAlphabetically.

Учебное пособие по условному рендерингу в документации React сосредоточено на тексте в пределах кнопки, но я пытаюсь условно визуализировать JSX в моем методе рендеринга в зависимости от того, была ли нажата отдельная кнопка.

Вот мой код, который возвращает Parsing error: this is a reserved word.

import React, { Component } from 'react';
import { connect } from 'react-redux';
import CarCard from '../components/CarCard';
import CarForm from './CarForm';
import './Cars.css';
import { getCars } from '../actions/cars';
import { sortCar } from '../actions/cars';

Component.defaultProps = {
  cars: { cars: [] }
}

class Cars extends Component {
  constructor(props) {
    super(props)
      this.state = {
        cars: [],
        sortedCars: [],
        buttonClicked: false
      };
  }

sortAlphabetically = () => {
    handleSortClick();
    const newArray = [].concat(this.props.cars.cars)
    const orgArray = newArray.sort(function (a,b) {
      var nameA = a.name.toUpperCase();
      var nameB = b.name.toUpperCase();
      if (nameA < nameB) {
        return -1;
      } else if (nameA > nameB) {
        return 1;
      } 
      return 0;
    })  
    this.setState({ cars: {cars: orgArray} })
}

componentDidMount() {
     this.props.getCars()
    // this.setState({cars: this.props.cars})
  }

 handleSortClick() {
    this.setState({
      buttonClicked: !this.state.buttonClicked})
  }

render() {

  const buttonClicked = this.state.buttonClicked
  let display;

  if (this.state.buttonClicked = false) {
    display = {this.state.cars.cars && this.state.cars.cars.map(car => <CarCard key = {car.id} car = {car}/>)}  
  } else {
{this.props.cars.cars && this.props.cars.cars.map(car => <CarCard key = {car.id} car = {car} />)}  
  }
    return (
<div className = "CarsContainer">
    <h3>Cars Container</h3> 
        <button onClick = {this.sortAlphabetically}>Sort</button>
        {display}
        <CarForm />
    </div>
    );
  }
}

 const mapStateToProps = (state) => {
  return ({
    cars: state.cars
  })
}

const mapDispatchToProps = (dispatch) => {
  return {
    sortCar: (cars) => dispatch(sortCar(cars)),
    getCars: (cars) => dispatch(getCars(cars))
  }
}

export default connect(mapStateToProps, mapDispatchToProps)(Cars);

В конечном итоге я пытаюсь сделать следующее:

  • установить начальное состояние buttonClicked на false
  • переключать логическое значение buttonClicked всякий раз, когда запускается sortAplhabetically
  • отображать this.state.cars.cars && this.state.cars.cars.map(car => <CarCard key = {car.id} car = {car}/>)}, когда ложный
  • отображать {this.props.cars.cars && this.props.cars.cars.map(car => <CarCard key = {car.id} car = {car} />)}, когда истинный

Любая помощь приветствуется.

Я почти уверен, что ваши реквизиты по умолчанию определены неправильно. Они должны быть после вашего класса Cars, а синтаксис должен быть изменен на Cars.defaultProps = {...

Chris Sandvik 19.03.2019 20:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
78
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать тернарный оператор. Так

{this.state.buttonClicked ? ({this.props.cars.cars && this.props.cars.cars.map(car => <CarCard key = {car.id} car = {car} />)}) : (this.state.cars.cars && this.state.cars.cars.map(car => <CarCard key = {car.id} car = {car}/>)})}

Я получаю сообщение об ошибке из-за того, что this является reserved word. Я не думаю, что смогу использовать this таким образом

James 19.03.2019 21:05

На {this.state.buttonClicked ?

James 19.03.2019 21:20

Вот что я пытаюсь сказать, напишите код выше внутри вашей функции рендеринга

Mikail Bayram 20.03.2019 10:18

Вот самое простое решение, которое я могу придумать. Вам НЕОБХОДИМО заменить свой собственный код в некоторых местах. Но часть вашего кода была удалена, потому что она вызывает проблемы и чрезмерно усложняет задачу. Вы сможете найти решение своей проблемы в этом ответе, однако это не будет так просто, как копирование.

ваш контрольный список:

  • иметь начальное состояние buttonClicked, установленное в false: сделано
  • переключать логическое значение buttonClicked всякий раз, когда запускается sortAplhabetically: вместо этого я просто сортирую массив автомобилей.

Для двух других пунктов контрольного списка (опущены из-за проблем с форматированием кода). Вы, вероятно, хотите использовать состояние, а не состояние X, в противном случае реквизит.

class Cars extends Component {
  constructor (props) {
    super(props)
    this.state = {
      carList: [{ id: 'apple' }, { id: 'orange' }, { id: 'zealot' }]
    }
  }

  sortAlphabetical () {
    this.setState({
      carList: this.state.carList.reverse()
    })
  }

  render () {
    const CarsList = () => {
      return this.state.carList.map(car => {
        return <li>{car.id}</li>
      })
    }

    return (
      <div className='CarsContainer'>
        <h3>Cars Container</h3>
        <button onClick = {this.sortAlphabetical.bind(this)}>Sort</button>
        <CarsList />
      </div>
    )
  }
}

ПРИМЕЧАНИЕ. Я пропустил часть вашего кода, потому что у меня нет возможности воссоздать вашу среду без доступа ко всем используемым файлам. Этого должно быть достаточно для понимания основных идей.

Ответ принят как подходящий

Сохранил мой JSX в переменных, которые будут отображаться при условии:

render() {

 let message
   if (this.state.buttonClicked) {
    message = this.state.cars.cars && this.state.cars.cars.map(car => <CarCard key = {car.id} car = {car}/>)  
  } else {
  message = this.props.cars.cars && this.props.cars.cars.map(car => <CarCard key = {car.id} car = {car} />)
 }

return (
<div className = "CarsContainer">
    <h3>Cars Container</h3> 
    <button onClick = {this.sortAlphabetically}>Sort</button>
    {message}
    <CarForm />
</div>
);
   }
 }

Другие вопросы по теме