Получите идентификатор клика от родительского к дочернему элементу с помощью ReactJs

Я разрабатываю приложение на ReactJs, и теперь мне нужно передать идентификатор клика со страницы Main.js в Диван.js, который будет отображать различную информацию в зависимости от того, какой идентификатор вы только что нажали. У меня мой мин полностью отформатирован на PHP, я бы хотел, чтобы у ReactJs была глобальная переменная вроде $ _GET ahah. Может быть, это так, просто не сейчас. Я искал и не нашел то, что ищу. Я покажу код ниже. Код Main.js без импорта:

export class Main extends React.Component {

    constructor(props) {
        super(props);
        this.state = {
            token: {},
            isLoaded: false,
            models: [],
            offset: offset,
            limit: limit
        };
    }

    componentDidMount() {

        /* Some code not relevant to the question, for getting API token */

        fetch('url/couch-model?offset=' + offset + '&limit=' + limit, {
            method: 'GET',
            headers: {
                'Content-Type': 'application/json',
                'Accept': 'application/json',
                'Authorization': 'JWT ' + (JSON.parse(localStorage.getItem('token')).token)
            }
        }).then(res => {
            if (res.ok) {
                return res.json();
            } else {
                throw Error(res.statusText);
            }
        }).then(json => {
            this.setState({
                models: json.results,
                isLoaded: true
            }, () => { });
        })    
    }

    render() {

        const { isLoaded, models } = this.state;

        if (!isLoaded) {

            return (
                <div id = "LoadText">
                    Loading...
                </div>
            )

        } else {

            return (
                <div>

                    {models.map(model =>
                        <a href = {"/sofa?id = " + model.id} key = {model.id}>
                            <div className = "Parcelas">
                                <img src = {"url" + model.image} className = "ParcImage" alt = "sofa" />
                                <h1>{model.name}</h1>

                                <p className = "Features">{model.brand.name}</p>

                                <button className = "Botao">
                                    <p className = "MostraDepois">Ver Detalhes</p>
                                    <span>+</span>
                                </button>
                                <img src = "../../img/points.svg" className = "Decoration" alt = "points" />
                            </div>
                        </a>
                    )}

                    <PageButtons offset = {offset} />

                </div>
            )
        }
    }
}

Как вы можете видеть, <a> внутри второго возврата отправляет идентификатор, хотя я не уверен, что это правильный путь. Я попытался написать это route-js путь, подобный этому /sofa/:id, но каким-то образом CSS внутри / диван / 1 перестал работать, независимо от идентификатора.

Теперь код Sofa.js, без импорта и только соответствующий код:

export class Sofa extends React.Component {

    constructor(props) {
        super(props);
        this.state = {
            token: {},
            isLoaded: false,
            model: {}
        };
    }

    componentDidMount() {

        fetch(url + '/couch-model/1{/*this show be id clicked and sent by url*/}/', {
            method: 'GET',
            headers: {
                'Content-Type': 'application/json',
                'Accept': 'application/json',
                'Authorization': 'JWT ' + (JSON.parse(localStorage.getItem('token')).token)
            }
        }).then(res => {
            if (res.ok) {
                return res.json();
            } else {
                throw Error(res.statusText);
            }
        }).then(json => {
            this.setState({
                model: json,
                isLoaded: true
            }, () => {});
        })
    }

    render() {

        const { model, isLoaded } = this.state;

        if (!isLoaded) {

            return (
                <div id = "LoadText">
                    Estamos a preparar o seu sofá!
                </div>
            )

        } else {

            return (
                <div id = "Esquerda">    
                    <h2>{model.area_set.map(area => area.name)}</h2>    
                    <h1>{model.name}</h1>
                    <p>Highly durable full-grain leather which is soft and has  a natural look and feel.</p>    
                    <h3>Design</h3>
                    <h4>Hexagon</h4>
                </div>
            );

        }

    }

}

Также вот route.js:

const Routes = (props) => (
    <BrowserRouter>
        <Switch>
            <Route path='/sofa/:id' component = {Sofa}/>
            <Route path='/home' component = {Home}/>
            <Route path='*' component = {NotFound}/>            
        </Switch>
    </BrowserRouter>
);

export default Routes;
Поведение ключевого слова "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) для оценки ваших знаний,...
3
0
845
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я вижу, что вы не используете (из того, что я вижу в примере) реактивный маршрутизатор.

Я действительно рекомендую вам использовать его, потому что он упрощает такие ситуации.

Как в примере это

const ParamsExample = () => (
  <Router>
    <div>
      <h2>Accounts</h2>
      <ul>
        <li>
          <Link to = "/netflix">Netflix</Link>
        </li>
        <li>
          <Link to = "/zillow-group">Zillow Group</Link>
        </li>
        <li>
          <Link to = "/yahoo">Yahoo</Link>
        </li>
        <li>
          <Link to = "/modus-create">Modus Create</Link>
        </li>
      </ul>

      <Route path = "/:id" component = {Child} />
    </div>
  </Router>
);

И компонент Child имеет соответствие, введенное маршрутом.

const Child = ({ match }) => (
  <div>
    <h3>ID: {match.params.id}</h3>
  </div>
);

Вот CodeSandbox, с которым вы можете поиграть

В вашем случае Диван - это компонент Ребенок. Вы можете вызвать любой API-интерфейс на componentDidMount с идентификатором, полученным из URL-адреса.

У меня есть response-router в другом файле с именем route.js, я пытался использовать /: id, но CSS на этой странице просто перестал работать

soalrib 03.08.2018 10:40

@SofiaRibeiro, вы видите полное обновление страницы? проверьте источник просмотра со страницы и посмотрите, видите ли вы файл css.

João Cunha 03.08.2018 10:49

Да, обновляется. Я проверил сейчас, и в основном это меняет путь к localhost:3000/sofa/styles.css, а реальный путь - localhost:3000/styles.css. Почему это происходит?

soalrib 03.08.2018 10:54

@SofiaRibeiro вместо тега в Main используйте компонент Link. Вероятно, ваш файл css объявлен относительно как <link href = "/ your-file.css" />, поэтому, поскольку вы используете тег, он фактически обновляет страницу, а файл css выполняет поиск относительно. Ты понимаешь?

João Cunha 03.08.2018 11:11

Да! Теперь CSS работает, спасибо большое! Остальное протестирую сейчас :)

soalrib 03.08.2018 11:14

Куда ему идти, const Child, в Sofa.js?

soalrib 03.08.2018 11:16

@SofiaRibeiro, ваш Компонент Дивана такой же, как и Ребенок, поэтому вам не нужно делать это именно так. Просто адаптируйся к твоему случаю

João Cunha 03.08.2018 11:44

@SofiaRibeiro, что всегда произойдет, если у вас есть относительный путь. вы должны объявить его как абсолютный путь, например: <link href = "локальный: 3000 / mycss.css" />

João Cunha 03.08.2018 11:58

У меня есть './styles.css', но даже если я поставлю 'styles.css', происходит то же самое

soalrib 06.08.2018 10:12

@SofiaRibeiro, у вас должно быть что-то вроде локальный: 3030 / styles.css. Это абсолютный путь. Вам нужно настроить его на любой порт или URL-адрес, который у вас есть.

João Cunha 06.08.2018 12:13

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