Как определить рост ребенка?

Как можно элегантно отслеживать изменение высоты экрана в компоненте App, учитывая что контент подгружается через REST во вложенных компонентах? Можно ли использовать watch или есть более элегантные способы?
  • 8 января 2024 г. 16:48
Ответы на вопрос 2
Для измерения роста ребенка обычно используют измерительную ленту или специальные ростомеры. Врач или родители могут измерить рост ребенка, поставив его босиком прямо у стены без обуви и с плоской головой. Затем отмечают точку на стене, где затылок ребенка встречается со стеной, и измеряют расстояние от пола до этой точки.

Что касается отслеживания изменений высоты экрана в компоненте приложения (особенно в контексте фронтенд-фреймворков типа Vue.js или React), можно использовать событие `resize` window для обновления состояния в component. Например, вы можете создать обработчик событий, который обновляется каждый раз, когда изменяется размер окна:

```javascript
mounted() {
    window.addEventListener('resize', this.handleResize);
},
beforeDestroy() {
    window.removeEventListener('resize', this.handleResize);
},
methods: {
    handleResize() {
        // Ваш код для обработки изменения размера экрана
    }
}
```

Также, если вы используете фреймворк Vue.js, `watch` можно использовать для наблюдения за реактивными данными, но для отслеживания изменения высоты экрана использование `watch` не является необходимым, так как само событие `resize` не является реактивным данным - это событие браузера.

Кроме того, если вы используете более современный подход, такой как хуки в React (например, `useState` и `useEffect`) или Composition API в Vue 3, вы можете также организовать отслеживание в более функциональном стиле.

В случае React это будет выглядеть примерно так:

```javascript
import React, { useState, useEffect } from 'react';

function App() {
    const [windowHeight, setWindowHeight] = useState(window.innerHeight);

    useEffect(() => {
        const handleResize = () => {
            setWindowHeight(window.innerHeight);
        };

        window.addEventListener('resize', handleResize);

        // Очистите подписку при размонтировании
        return () => {
            window.removeEventListener('resize', handleResize);
        };
    }, []);

    // У rest компонентов есть доступ к состоянию windowHeight, чтобы реагировать на изменения
    return (
        <div>
            {/* содержимое вашего приложения */}
        </div>
    );
}

export default App;
```

В Vue 3 с Composition API это может выглядеть так:

```javascript
<template>
  <!-- содержимое вашего приложения -->
</template>

<script>
import { onMounted, onUnmounted, ref } from 'vue';

export default {
  setup() {
    const windowHeight = ref(window.innerHeight);

    const handleResize = () => {
      windowHeight.value = window.innerHeight;
    };

    onMounted(() => {
      window.addEventListener('resize', handleResize);
    });

    onUnmounted(() => {
      window.removeEventListener('resize', handleResize);
    });

    return {
      windowHeight,
    };
  },
};
</script>
```

Эти подходы позволяют отслеживать изменение высоты экрана и реагировать на эти изменения в вашем приложении. Но следует учитывать, что частые изменения размера и обновления состояния могут негативно сказаться на производительности, поэтому в некоторых случаях может потребоваться дебаунсинг (задержка выполнения функции до того как остановятся последовательные вызовы) событий resize для снижения количества вычислений.
По хорошему - тебе это не должно быть нужно. В 99% случаев возникновение такой необходимости говорит о том, что где-то в структуре закралась ошибка (либо о неумении верстать). 

В оставшемся 1%: element ref + ResizeObserver (или какая-нить готовая директива , которая сделает то же самое под капотом).
Похожие вопросы