Задать вопрос
  • Ваши плагины и пакеты на sublime text для javascript, react, jsx разработки?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Ответ написан
    Комментировать
  • Ваши плагины и пакеты на sublime text для javascript, react, jsx разработки?

    iiiBird
    @iiiBird
    Пока ты спишь - твой конкурент совершенствуется
    саблайм - это редактор, а webstorm - это IDE. не пытайтесь из редактора сделать IDE. в конечном итоге все равно ничего не получится.
    p.s. посоветую visual studio code. по шустрости он не уступает саблайму и при этом является IDE.
    Ответ написан
    3 комментария
  • Как вывести контекст нажатого компонента React?

    Хочу дополнить ответ juicyigor т.к. он содержит одну критическую (для производительности) ошибку:

    <First 
      city={data.city} 
      handleClick={this.handleClick(data.city)} 
    />


    handleClick = city => () => {
      this.setState({
        selectedCity: city,
      });
    };


    Суть в том, что мы при каждом рендере создаем новый коллбэк и передаем его как prop компоненту First. Во-первых: даже без реакта у вас могут возникнуть проблемы со сборщиком мусора, если вы достаточно часто делаете ререндер. Во-вторых: хорошей практикой для компонентов-представлений (глупых компонентов - dump components) является использование так называемого pure render (путем наследования класса компонента от React.PureComponent). Это дает нам возможность ререндерить (обновлять) компонент только в том случае, если props или state изменились. У Вас в компоненте First state не используется, значит, рендер компонента будет зависеть только от props, но при этом - при каждом рендере родительского компонента вы передаете в First новый экземпляр handleClick. Значит - компонент First будет каждый раз рендерится, даже если по сути - данные не поменялись. Это плохо и является антипаттерном. Предлагаю вот такой вариант:

    class First extends React.PureComponent {
      handleClick = () => {
        const { onClick, city } = this.props
    
        return onClick(city)
      }
    
      render() {
        const { onClick, city } = this.props
    
        return (
          <div className="first">
            <button onClick={onClick && this.handleClick}>
              click
            </button>
            <p>{city}</p>
          </div>
        )
      }
    }


    В компонент First я добавил метод handleClick, который вызывает коллбэк onClick (который передан через props) и передает туда city. Таким образом мы избавились от пересоздания коллбэка в рендере родительского компонента. Также обратите внимание на определение этого метода:

    handleClick = () => {

    Такая запись подразумевает в себе автобиндинг: т.е. this у вас будет ссылаться именно на ваш элемент.

    И небольшое замечание по названиям: handleSomething - это функция, которую вы передаете в свойство с названием onSomething. Пример:
    <input onBlur={handleBlur} />

    И исходя из предложенных изменений код родительского компонента будет выглядеть так:

    class TestComponent extends React.PureComponent{
      constructor() {
        super();
        this.state = {
          selectedCity: false,
        };
      }
      
      handleClick = city => {
        this.setState({
          selectedCity: city,
        });
      };
      
      render() {
        return (
          <div>
            {locations.map((data, i) => 
              <First 
                city={data.city} 
                onClick={this.handleClick} 
              />
            )}
            <Second city={this.state.selectedCity} />
          </div>
        );
      }
    }


    PS саму логику я не трогал, просто хотел обратить Ваше внимание на ошибки.
    Ответ написан
    3 комментария
  • Как вывести контекст нажатого компонента React?

    @juicyigor
    const locations = [
      {
        city: "New York"
      },
      {
        city: "Moscow"
      }
    ];
    
    const First = props => 
      <div className="first">
        <button onClick={props.handleClick}>
          click
        </button>
        <p>{props.city}</p>
      </div>;
    
    const Second = props => 
      <div className="second">
        <span>
          {props.city && props.city}
        </span>
      </div>;
    
    class TestComponent extends React.Component {
      constructor() {
        super();
        this.state = {
          selectedCity: false,
        };
      }
      
      handleClick = city => () => {
        this.setState({
          selectedCity: city,
        });
      };
      
      render() {
        return (
          <div>
            {locations.map((data, i) => 
              <First 
                city={data.city} 
                handleClick={this.handleClick(data.city)} 
              />
            )}
            <Second city={this.state.selectedCity} />
          </div>
        );
      }
    }
    
    ReactDOM.render(
    <TestComponent />, 
    document.querySelector('[data-role-id="content"]'));


    Здесь есть небольшой недочет в том, что this.handleClick при перерисовке пересоздается, но думаю для вас это не очень критично
    Ответ написан
    Комментировать
  • Как вывести контекст нажатого компонента React?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Codepen

    Для изменяемых данных в зеленом блоке, можно использовать state компонента. Устанавливаете state через функцию, которую передаете в props ( везде называется handleClick, но для удобства можете переименовать). Чтобы передать 'city' можно придумать разные варианты, например, с помощью data-*атрибута у элемента, который будет доступен внутри e.target.dataset.*

    Зачем в constructor'e - this.XXX = this.XXX.bind(this) - жду ответ от вас )
    Ответ написан
    5 комментариев
  • Какая из IDE для PHP 7 удобнее?

    miraage
    @miraage
    Старый прогер
    PhpStorm.
    Не могу пересесть на другие IDE из-за:
    - автокомплита
    - рефакторинга
    - гибкости/настроек
    - плагинов

    Если работаете по найму и не можете себе позволить лицензию - попросите компанию ее Вам купить.
    500р/месяц в первый год, -20% за второй год, -40% в последующие, если подписка всё время активна - это совсем немного.

    Просто подумайте, сколько денег тратите в месяц на ненужную фигню, типа шоколадок/чипсов/сигарет. Сразу деньги на лицензию найдутся.
    Ответ написан
    5 комментариев