использовать состояние другого класса - PullRequest
0 голосов
/ 25 мая 2020

Я сейчас работаю над школьным проектом. У меня есть приложение для определения местоположения на карте. Но как-то мне нужно передать координаты значения состояния. Но я не могу поделиться этим в следующем классе ... Может ли кто-нибудь мне помочь?

Код:

import React from 'react';
import '../style/card.css';
import '../js/functions/maps';
import Button from './button.js';
import { getLocation } from './functions/getLocation.js';
import './functions/maps';



class Mobile extends React.Component {
  state = {
    coordinates: {}
  };

  getLocationCoordinates = () => {
    getLocation((coordinates) => {
      this.setState({ coordinates });
      console.log(this.state.coordinates);
    });
  };

  functionCoordinatePrint = (index) => {
    return this.state.coordinates[index] ? this.state.coordinates[index] : Math.random() * 50 + 1;
  };

  render() {
    const { lat, lng } = this.state.coordinates;
    return (
      <div id={'location'} className={'card'}>
        <div className={'card-layout'}>
          <div className={'text-card'}>
            <h1>{this.props.header}</h1>
            {this.props.text !== '' && <p className={'max-width-70'}>{this.props.text}</p>}
            <div
              style={{
                color: 'var(--color-text)'
              }}
            >
              <input type="checkbox" id="conditions-read" />
              <a href="../pages/algemene-voorwaarden">Accepteer voorwaarden</a>
            </div>

            <Button function={this.getLocationCoordinates} text={'Allow Location'} />
            <p>{this.props.coordinaten}</p>
          </div>
          <div className={'mobile'}>
            <img src={this.props.device} className={'device'} alt={this.props.alt_image} />
            <div className={'overlay'}>
              <div id={'location-maps'}>
                <iframe
                  title="map"
                  frameBorder="0"
                  scrolling="no"
                  marginHeight="0"
                  marginWidth="0"
                  src={`https://www.mapquest.com/near-${this.functionCoordinatePrint(
                    'latitude'
                  )},${this.functionCoordinatePrint('longitude')}?zoom=3`}
                />
              </div>
            </div>
          </div>
        </div>
      </div>
    );
  }
  coordinatesToArray = coordinatesToArray[
    (this.functionCoordinatePrint('latitude'), this.functionCoordinatePrint('longitude'))
  ];
}

class Laptop extends React.Component {
  render() {
    return (
      <div id={'recommendations'} className={'card'}>
        <div className={'card-layout'}>
          <h1>{this.props.header}</h1>

          <div className={'laptop'}>
            <img
              style={{
                width: '150%'
              }}
              src={this.props.device}
              alt={this.props.alt}
            />
            <div className={'overlay-laptop'}>
              <div className={'maps'}>
                <iframe
                  title="mapExample"
                  frameBorder="0"
                  scrolling="no"
                  marginHeight="0"
                  marginWidth="0"
                  src={
                    'https://www.mapquest.com/near-' +
                    (this.props.lat ? this.props.lat : Math.random() * 30 + 1) +
                    ',' +
                    (this.props.long ? this.props.long : Math.random() * 30 + 1) +
                    '?zoom=3'
                  }
                />
              </div>
            </div>
          </div>
        </div>
      </div>
    );
  }
}

export { Mobile, Laptop };

Я пробовал использовать props.state.coordinates [0 ], Я также использовал глобальную переменную и установил значения в функции GetLocation (), а затем использовал ее в своей версии для ноутбука. Но может ли кто-нибудь мне помочь?

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 25 мая 2020
  1. Сначала разделите два компонента, мобильный телефон и ноутбук, в отдельные файлы. У них есть свои собственные состояния, которыми нужно управлять, и благодаря этому ваш код станет более управляемым. затем
  2. Импортировать компонент Laptop в компонент mobile.
  3. Передайте данные в компонент портативного компьютера, например, <Laptop data={this.state.coordinates}/>

  4. Внутри вашего компонента портативного компьютера эту информацию получите с помощью this.props.data

0 голосов
/ 25 мая 2020

В этом случае вам может помочь Компонент высшего порядка , или сокращенно HO C. Вы можете увидеть HO C как родительский компонент, где вы можете хранить координаты. Дочерние компоненты (в вашем случае Mobile и Laptop) могут затем устанавливать и получать доступ к данным в HO C, позволяя дочерним компонентам отображать координаты.

Давайте проясним это более подробно. Сначала вам нужно создать компонент HO C, который сохраняет координаты в своем состоянии. HO C должен иметь установщик, который необходимо передать дочерним компонентам как свойство. Значение координат также должно быть передано дочерним компонентам, что мы можем сделать с помощью оператора распространения .

const withCoordinates = (WrappedComponent) => {
    class WithCoordinates extends Component {
        constructor(props) {
            super(props);
            this.state = {
              coordinates: [],
            };
          }

          setCoordinates = (event) => {
            const { name, value } = e.target;
            this.setState({ [name]: value });    
          }

          render() {
              return (
                    <WrappedComponent
                      setCoordinates={(coordinates) => this.setCoordinates(coordinates)}
                      {...this.state}
                    />
              );
          }
    }

    return WithCoordinates;
}

export default withCoordinates;

Затем нам нужно подключить дочерние компоненты, чтобы он мог доступ к значениям, определенным в HO C. Поскольку мы передали значение coordinates и метод setCoordinates через свойства, мы можем получить к ним доступ в дочернем компоненте.

class Laptop extends Component {
    render() {
        const { setCoordinates, coordinates } = this.props;

        return (
            <>
                <input name='coordinates' value={coordinates || ''} onChange={(e) => setCoordinates(e)} />
                <p>The coordinates are {coordinates}</p>
            </>
        );
    }
}

export default WithCoordinates(Laptop);

Обратите внимание, что дочерний компонент экспортируется вместе с компонентом WithCoordinates в оболочке вокруг него. Это дает возможность дочернему компоненту получить доступ к значениям в HO C. Имя поля ввода в дочернем компоненте соответствует значению состояния, которое устанавливается в HO C.

Не забудьте проверить свойства с помощью библиотеки Proptypes .

0 голосов
/ 25 мая 2020

Самый простой способ - просто передать данные через props. Если Laptop и Mobile являются братьями и сестрами, вам нужно будет «поднять состояние» до общего родительского компонента, затем вы можете управлять состоянием в нем и передавать его каждому из дочерних элементов, используя реквизиты, например

<Mobile myState={myStateVariable} /> <Laptop myState={myStateVariable} />

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