Почему в state присутствует только unconn
Перейти к содержимому

Почему в state присутствует только unconn

  • автор:

Состояние компонента¶

Метод setState() следит за изменением состояния ( state ) компонента. state — это объект. Когда состояние меняется, компонент рендерится повторно.

Какая разница между state и props ?¶

props (намеренно сокращённо от англ. «properties» — свойства) и state — это обычные JavaScript-объекты. Несмотря на то, что оба содержат информацию, которая влияет на то, что увидим после рендера, есть существенное различие: props передаётся в компонент (служат как параметры функции), в то время как state находится внутри компонента (по аналогии с переменными, которые объявлены внутри функции).

Несколько полезных ресурсов для дальнейшего изучения, в каких случаях использовать props , а в каких — state :

  • Props vs. State
  • ReactJS: Props vs State

Почему setState даёт неверное значение?¶

В React как this.props , так и this.state представляют значения, которые уже были отрендерены, например, то, что видите на экране.

Вызовы setState являются асинхронными, поэтому не стоит рассчитывать, что this.state отобразит новое значение мгновенно после вызова setState . Необходимо добавить функцию, которая сработает только после обновления состояния, если нужно получить новое значение, основанное на текущем состоянии (ниже подробный пример).

Пример кода, который не будет работать так, как ожидаем:

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
incrementCount()  // Примечание: это *не* сработает, как ожидалось. this.setState(count: this.state.count + 1>); > handleSomething()  // Допустим, что `this.state.count` начинается с 0. this.incrementCount(); this.incrementCount(); this.incrementCount(); // Когда React делает последующий рендер компонента, `this.state.count` будет 1, хотя мы ожидаем 3. // Так происходит, потому что функция `incrementCount()` берёт своё значение из `this.state.count`, // но React не обновляет `this.state.count`, пока компонент не отрендерится снова. // Получается, что `incrementCount()` обращается к текущему значению `this.state.count`, а это 0 каждый раз, и добавляет 1. // Как исправить это — разберём ниже! > 

Далее перейдём к исправлению указанной проблемы.

Как обновить состояние значениями, которые зависят от текущего состояния?¶

Нужно добавить функцию вместо объекта к setState , которая будет срабатывать только на самой последней версии состояния (пример ниже).

В чём разница между добавлением объекта или функции к setState ?¶

Добавление функции даёт вам доступ к текущему состоянию внутри самой функции. Так как setState вызовы «сгруппированы», это помогает связать изменения и гарантирует, что они будут выполняться друг за другом, а не конфликтовать.

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
incrementCount()  this.setState((state) =>  // Важно: используем `state` вместо `this.state` при обновлении. return count: state.count + 1> >); > handleSomething()  // Возьмём снова для примера, что `this.state.count` начинается с 0. this.incrementCount(); this.incrementCount(); this.incrementCount(); // Если посмотреть на значение `this.state.count` сейчас, это будет по-прежнему 0. // Но когда React отрендерит компонент снова, будет уже 3. > 

Когда setState работает асинхронно?¶

В настоящее время setState работает асинхронно внутри обработчиков событий.

Это даёт гарантию, например, когда Родитель и Ребёнок вызывают setState во время клика, Ребёнок не будет рендерится дважды. Вместо этого React «откладывает» обновление состояния в самый конец событий в браузере. Это помогает сильно повысить производительность больших приложений.

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

Почему React не обновляет this.state синхронно?¶

Как говорилось ранее, React намеренно «ждёт» пока все компоненты вызовут setState() в своих обработчиках событий прежде чем начать повторный рендер. Это избавляет от ненужных повторных рендеров.

Вы можете задаваться вопросом: почему React не может просто сразу обновить this.state без повторного рендеринга?

На это есть две причины:

  • Это нарушит логику работы props и state , а значит станет причиной многих багов, которые будет сложно исправить.
  • Это сделало бы невозможным реализацию некоторых возможностей, над которыми мы сейчас работаем.

Этот GitHub-комментарий рассматривает конкретные примеры, которые помогут глубже изучить этот вопрос.

Стоит ли использовать такие библиотеки, как Redux или MobX?¶

Но вообще будет здорово сначала изучить React, прежде чем переходить к библиотекам. Можно создать готовое рабочее приложение, используя только React.

Как передать state из одного компонента в другой

Костыльный и непонятный выход. Для чего вы используете контекст в функциональном компоненте? Или же компонент, в котором находится FilterMobile является классом? Тогда нужно было сразу уточнить.

11 мар 2022 в 4:50

Ну так вы почти правильно всё делаете. Я про сам метод передачи в другой компонент. А вот проблема у вас сейчас в том, что вы пытаетесь использовать обычный функциональный компонент, как классовый. Определитесь, какой он должен быть: классовый или функциональный? Если всё-таки функциональный, то просто вызовите функцию при клике (например), но не используйте this.setState (это установка стейта в классовом компоненте) как-то так: onClick= tokensCount()>

Если компонент, должен стать классовым, то его нужно переписать иначе: унаследовать React.Component, добавить метод render и т.д.

Вот как можно использовать то, о чем я писал выше:

import < useState >from "react"; import "./styles.css"; export default function App() < let [count, setCount] = useState(0); let tokensCount = () => < setCount(count + 1) >return ( 
count: />
); > const FilterMobile = () => < return (
) >

what is u_dgr UNCONN when I run ss -lnp | grep sshd

I was running ss -lnp | grep sshd and received the following output (in addition to the LISTEN port(s) I was expecting. Not sure what this is tho:

u_dgr UNCONN 0 0 *78056 *12438 users:(("sshd",pid=22409, fd=4), ("sshd",pid=22337,fd=4) 

Thanks in advance for helping me decipher this.
6,625 7 7 gold badges 30 30 silver badges 37 37 bronze badges
asked Aug 24, 2016 at 1:07
481 3 3 gold badges 6 6 silver badges 13 13 bronze badges

1 Answer 1

I tried to figure it out. Below are my notes:

u_dgr = u is for UDS (Unix Domain Socket). «Programs that run on the same server can also communicate with each other using Unix Domain Sockets (UDS). Unix Domain Sockets can be stream-based, or datagram-based. When using domain sockets, data is exchanged between programs directly in the operating system’s kernel via files on the host filesystem. To send or receive data using domain sockets, programs read and write to their shared socket file, bypassing network based sockets and protocols entirely» (src). dgr is for datagram. Datagram is opposed to str that stands for stream. dgr is like UDP and str is like TCP for IP protocols.

UNCONN = unconnected. Same as Closed. Datagram protocols are stateless, hence ss always shows such connections as UNCONN.

0 0 is for recv-q and send-q. Shows how many bytes in the queue. 0 means that there is no bytes in the queue.

*78056 *12438 says that programs that are mentioned in ‘users:’ use any address and port 78056 to send data to the remote port 12438 and any address. sshd program uses port 78056 to send logs to systemd. logs are sent to port 12438. If you do ss -lxnp | grep 12438 then you will see systemd listening on 12438.

In users:((«sshd»,pid=22409, fd=4), («sshd»,pid=22337,fd=4) pid is for process ID. fd is for file descriptor. You can check it with ls -lh /proc/22409/fd/

why ss(8) understands listening UDP ports differently than netstat(8)?

If I execute ss -lu in order to view all the listening UDP sockets, then none of the sockets are displayed. If I execute ss -au , which lists all(both listening and non-listening) UDP sockets, then «listening» sockets are displayed as UNCONN (see below). What is the logic behind this? For example running atftpd listening for connections, should have state LISTEN not UNCONN, shouldn’t it?

T60:~ # lsof -n | sed -n '1p;/UDP/p' COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME avahi-dae 963 avahi 11u IPv4 9088 0t0 UDP *:mdns avahi-dae 963 avahi 12u IPv4 9089 0t0 UDP *:44639 cupsd 1238 root 10u IPv4 8160 0t0 UDP *:ipp dhcpcd 2072 root 7u IPv4 532052 0t0 UDP *:bootpc dhclient6 13131 root 5u IPv6 38031 0t0 UDP *:dhcpv6-client dhclient6 13131 root 20u IPv4 37954 0t0 UDP *:20152 dhclient6 13131 root 21u IPv6 37955 0t0 UDP *:36745 atftpd 20639 tftp 0u IPv4 344977 0t0 UDP *:tftp 
T60:~ # netstat -lu Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State udp 0 0 *:bootpc *:* udp 0 0 *:tftp *:* udp 0 0 *:44639 *:* udp 0 0 *:ipp *:* udp 0 0 *:20152 *:* udp 0 0 *:mdns *:* udp 0 0 *:36745 *:* udp 0 0 *:dhcpv6-client *:* 
T60:~ # ss -lu Recv-Q Send-Q Local Address:Port Peer Address:Port T60:~ # ss -ua State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 *:bootpc *:* UNCONN 0 0 *:tftp *:* UNCONN 0 0 *:44639 *:* UNCONN 0 0 *:ipp *:* UNCONN 0 0 *:20152 *:* UNCONN 0 0 *:mdns *:* UNCONN 0 0 . 36745 . * UNCONN 0 0 . dhcpv6-client . * T60:~ # ss -v ss utility, iproute2-ss110629 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *