#javascript #reactjs #conditional-formatting
#javascript #reactjs #условное форматирование
Вопрос:
У меня есть приложение, которое сначала показывает список автомобилей на основе реквизитов, но нажатие sort
кнопки преобразует отображение в список в алфавитном порядке.
Я пытаюсь установить функцию, которая изменяет состояние buttonClicked
при каждом нажатии sort
кнопки (которая запускается sortAlphabetically
.
Руководство по условному рендерингу в React docs сосредоточено на тексте внутри кнопки, но я пытаюсь условно отобразить 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 amp;amp; this.state.cars.cars.map(car => <CarCard key={car.id} car={car}/>)}
} else {
{this.props.cars.cars amp;amp; 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 amp;amp; this.state.cars.cars.map(car => <CarCard key={car.id} car={car}/>)}
при false - отображать
{this.props.cars.cars amp;amp; this.props.cars.cars.map(car => <CarCard key={car.id} car={car} />)}
при значении true
Любая помощь приветствуется.
Комментарии:
1. Я почти уверен, что ваши реквизиты по умолчанию определены неправильно. Они должны быть после вашего
Cars
класса, а синтаксис должен быть изменен наCars.defaultProps = {...
Ответ №1:
Вот самое простое решение, которое я могу придумать. В некоторых местах вам нужно будет заменить свой собственный код. Но часть вашего кода была удалена, потому что это вызывает проблемы и чрезмерно усложняет проблему. Вы должны быть в состоянии найти решение вашей проблемы в этом ответе, однако это не будет так просто, как скопировать вставку.
ваш контрольный список:
- для начального состояния buttonClicked установлено значение false: готово
- переключайте логическое значение buttonClicked при каждом запуске sortAplhabetically: вместо этого я просто сортирую массив cars.
Для двух других элементов контрольного списка (опущен из-за проблем с форматированием кода). Вероятно, вы хотите использовать state, а не if X state в противном случае поддерживает.
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>
)
}
}
ПРИМЕЧАНИЕ: я опустил часть вашего кода, потому что у меня нет возможности воссоздать вашу среду без доступа ко всем используемым файлам. Этого все равно должно быть достаточно для ознакомления с основными идеями.
Ответ №2:
Сохранил мой JSX в переменных, которые будут отображаться при условии:
render() {
let message
if (this.state.buttonClicked) {
message = this.state.cars.cars amp;amp; this.state.cars.cars.map(car => <CarCard key={car.id} car={car}/>)
} else {
message = this.props.cars.cars amp;amp; 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>
);
}
}
Ответ №3:
Вы можете использовать троичный оператор. Вот так
{this.state.buttonClicked ? ({this.props.cars.cars amp;amp; this.props.cars.cars.map(car => <CarCard key={car.id} car={car} />)}) : (this.state.cars.cars amp;amp; this.state.cars.cars.map(car => <CarCard key={car.id} car={car}/>)})}
Комментарии:
1. Я получаю сообщение об ошибке из-за того, что
this
являетсяreserved word
. Я не думаю, что смогу использоватьthis
этот способ2. На
{this.state.buttonClicked ?
3. Вот что я пытаюсь сказать, напишите приведенный выше код внутри вашей функции рендеринга