реагировать на обновление состояния массива объектов [duplicate]

Не ответ, но добавление: я получил, потому что запустил groovysh (Groovy 2.4.13), если JAVA_HOME указывает на установку Java 9 (точнее, java version "9.0.1"):

java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:107)
        at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:129)
Caused by: java.lang.NoClassDefFoundError: Unable to load class groovy.xml.jaxb.JaxbGroovyMethods due to missing dependency javax/xml/bind/JAXBContext
        at org.codehaus.groovy.vmplugin.v5.Java5.configureClassNode(Java5.java:400)
        at org.codehaus.groovy.ast.ClassNode.lazyClassInit(ClassNode.java:277)
        at org.codehaus.groovy.ast.ClassNode.getMethods(ClassNode.java:397)
        ...
        ..
        .
        ..
        ...
        at org.codehaus.groovy.tools.shell.Groovysh.(Groovysh.groovy:135)
        at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
        at org.codehaus.groovy.tools.shell.Main.(Main.groovy:66)
        at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
        at org.codehaus.groovy.tools.shell.Main.main(Main.groovy:163)
... 6 more

Решение было:

  • Перейти к проекту JAXB в github.io ( "JAXB лицензируется по двойной лицензии - CDDL 1.1 и GPL 2.0 с исключением Class-path ")
  • Загрузите jaxb-ri-2.3.0.zip
  • Разархивируйте, куда бы вы не вложили файлы инфраструктуры java (в моем случае, /usr/local/java/jaxb-ri/). Другое решение может существовать (возможно, через SDKMAN, я dunno)
  • Убедитесь, что банки в подкаталоге lib находятся на CLASSPATH. Я делаю это через скрипт, запущенный при запуске bash, называемый /etc/profile.d/java.sh, где я добавил (среди многих других строк) следующий цикл:

Упакован в функцию ...

function extend_qzminynshg {
   local BASE="/usr/local/java"
   for LIB in jaxb-api.jar  jaxb-core.jar  jaxb-impl.jar  jaxb-jxc.jar  jaxb-xjc.jar; do
      local FQLIB="$BASE/jaxb-ri/lib/$LIB"
      if [[ -f $FQLIB ]]; then
         export CLASSPATH=$FQLIB:$CLASSPATH
      fi
    done
}

extend_qzminynshg; unset extend_qzminynshg

И это работает!

2
задан Felix Kling 6 June 2016 в 17:15
поделиться

1 ответ

Ваша функция обновления будет выглядеть так

updateItem(id, itemAttributes) {
  var index = this.state.items.findIndex(x=> x.id === id);
  if (index === -1)
    // handle error
  else
    this.setState({
      items: [
         ...this.state.items.slice(0,index),
         Object.assign({}, this.state.items[index], itemAttributes),
         ...this.state.items.slice(index+1)
      ]
    });
}

И вы используете ее так

this.updateItem(2, {someattr: 'a new value'});

Gross right?


Но у вас будет большая головная боль вообще, если вы продолжите строить сложное приложение таким образом. Вы действительно должны изучить redux или другую реализацию Flux, которая лучше подходит для решения этих проблем.

Redux использует концепцию редукторов состояния, каждая из которых работает на определенном фрагменте состояние вашей заявки. Таким образом, вам не нужно вручную копать все ваше состояние каждый раз, когда вы хотите повлиять на глубокие изменения.

Создатель Redux, Дэн Абрамов, сделал два видеокурса онлайн бесплатно. Дэн - отличный учитель, и я чувствовал себя комфортно с рисунком Редукса, проведя всего один день с ним.

12
ответ дан user633183 22 August 2018 в 21:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: