JvectorMap перерисовывает правильные маркеры после setState reactjs

Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда данные, передаваемые в jvectormap, меняются, карта не отражает эти изменения.

Внутри моего штата у меня есть два набора данных: data1 и data2. Внутри моего метода рендеринга у меня есть кнопка, при нажатии на которую this.state.data1 будет иметь то же содержимое, что и this.state.data2, поскольку карта принимает this.state.data1 в качестве значения для markers. Вот моя функция рендеринга:

  render() {
    return (
      <div>
        <a
          href = "#"
          onClick = {() =>
            this.setState({ data1: this.state.data2 }, () =>
              console.info(this.state.data1)
            )
          }
        >
          Click
        </a>
        <div style = {{ width: 500, height: 300 }}>
          <VectorMap
            map = {"world_mill"}
            backgroundColor = "#FFFFF"
            markerStyle = {{
              initial: {
                fill: "#FFFF",
                stroke: "#383f47"
              }
            }}
            series = {{
              markers: [
                {
                  attribute: "r",
                  scale: [5, 20],
                  values: [60, 6, 54],
                  normalizeFunction: "polynomial"
                }
              ]
            }}
            regionStyle = {{
              initial: {
                fill: "#128da7"
              },
              hover: {
                fill: "#A0D1DC"
              }
            }}
            markers = {this.state.data1}
            ref = "map"
            containerStyle = {{
              width: "100%",
              height: "100%"
            }}
            containerClassName = "map"
          />
        </div>
      </div>
    );
  }
}

Весь код прост и находится здесь: https://codesandbox.io/s/2vx2k1vl9n. Как вы можете видеть, в методе onClick для кнопки я печатаю data1 после установки состояния, чтобы убедиться, что его значение изменяется, как и происходит, но не отражается на карте. Кто-нибудь может мне с этим помочь?

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
0
1 176
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Проблема в основном не в вашем коде. Я просто зашел в репозиторий React-jvectormap и взглянул на код, потому что подозреваю, что есть что-то, запрещающее повторный рендеринг.

Оказывается, карта не отображается с помощью ReactJS, вместо этого она отображается с помощью jQuery.

Я пошел, разветвил проект и изменил его код, чтобы он работал с приведенным выше примером.

Я сделаю пул-реквест в их репо, а вы можете попробовать использовать мою версию здесь: https://github.com/seifsg/react-jvectormap

И это файл, в который я внес изменения, вы можете просто скопировать и вставить его в нужное место в папке node_modules: https://github.com/seifsg/react-jvectormap/blob/master/src/lib/components/VectorMap.js

Итак, чтобы он работал с вашим кодом:

  • Скопируйте измененный файл в соответствующий каталог node_modules

  • В том же каталоге запустите npm i, затем npm run build, который должен сгенерировать новый файл сборки и заставить ваши изменения работать.

Вот пример, использующий только файл сборки: codeandbox.io/s/kw90mx7647

Привет, @Seif Sgayer, спасибо за ответ, я попробую это сделать, как только вернусь домой. Единственное изменение, которое вы внесли, - это добавление метода componentDidUpdate ()?

jim 16.01.2019 13:24

Да, именно этого не хватало.

Seif Sgayer 16.01.2019 13:52

Привет, @Seif Sgayer, я попробовал то, что вы предложили. Я скопировал, вставил ваш VectorMap.js в node_modules, сбросил сервер и попробовал. Он по-прежнему ведет себя так же

jim 17.01.2019 02:51

Я также удалил все из VectorMap.js и повторно запустил свою программу, и она работала точно так же ... Я редактирую node_modules / response-jvectormap / src / lib / components / VectorMap.j‌ s ... может это возможно это не тот файл?

jim 17.01.2019 02:54

@jim похоже, что их версия npm немного отличается от версии github. Они используют другой основной файл и используют веб-пакет. Итак, пока: * Скопируйте измененный файл в соответствующий каталог node_modules * В том же каталоге выполните npm i, затем npm run build, который должен сгенерировать новый файл сборки и заставить ваши изменения работать. Вот пример, использующий только файл сборки: codeandbox.io/s/kw90mx7647

Seif Sgayer 17.01.2019 13:52

спасибо вам большое, вы эксперт! Можете ли вы включить приведенный выше комментарий в ответ, чтобы я мог отметить его как правильный и наградить вас бонусными баллами

jim 17.01.2019 14:37

@jim Я сделал это. Спасибо!

Seif Sgayer 17.01.2019 16:15

Привет, @Seif Sgayer, я загрузил вашу песочницу кода и попытался запустить ее на своей машине и получил несколько ошибок, таких как 'define' is not defined и Expected an assignment or function call and instead saw an expression. Знаете ли вы, почему он работает в песочнице, а не локально на моей машине?

jim 18.01.2019 01:48

Вероятно, из-за изменения окружающей среды. Я не знаю точно причины, однако мой запрос на перенос был принят и объединен. Теперь вам не нужно копировать и вставлять код вручную. Вам просто нужно обновить свой React-jvectormap, и даже ваш исходный код и ящик теперь должны работать.

Seif Sgayer 18.01.2019 16:04

все, что я сделал, это нажал кнопку загрузки в codeandbox и запустил программу на моем компьютере после того, как я ее загрузил .... По запросу на перенос вы говорите о своей версии github? И что вы имеете в виду, обновив response-jvectormap, когда вы заменили его компонентом react-jvectormap-new-build? Разве я не смогу оставить его по-прежнему? ... Извините за эти вопросы, я новичок

jim 18.01.2019 17:04

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