Передать из родительского компонента в дочерний состояние?

Возможности передачи состояния из родительского компонента в дочерний компонент различаются в зависимости от используемой версии Vue.js.

В Vue.js версии 2.x, рекомендуется использовать механизмы передачи данных через props (свойства компонента) и emit (события).

Для передачи состояния из родительского компонента в дочерний компонент через props, сначала нужно определить доступные props в дочернем компоненте, а затем передать значение с родителя:

// В родительском компоненте:
<template>
  <div>
    <child-component :propName="parentState"></child-component>
  </div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';

export default {
  data() {
    return {
      parentState: 'example state' // состояние родительского компонента
    };
  },
  components: {
    ChildComponent
  }
}
</script>
// В дочернем компоненте (ChildComponent.vue):
<template>
  <div>
    <p>{{ propName }}</p>
  </div>
</template>

<script>
export default {
  props: ['propName'] // определение пропса
}
</script>

В данном примере, родительский компонент передает свое состояние parentState в дочерний компонент через prop propName. Дочерний компонент получает это значение в свойстве propName и может его использовать внутри.

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

// В родительском компоненте:
<template>
  <div>
    <p>{{ parentState }}</p>
    <child-component :propName="parentState" @update:propName="updateState"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  data() {
    return {
      parentState: 'example state' // состояние родительского компонента
    };
  },
  methods: {
    updateState(newValue) {
      this.parentState = newValue; // обновление состояния родительского компонента
    }
  },
  components: {
    ChildComponent
  }
}
</script>
// В дочернем компоненте (ChildComponent.vue):
<template>
  <div>
    <p>{{ propName }}</p>
    <button @click="updateProp">Update state</button>
  </div>
</template>

<script>
export default {
  props: ['propName'],
  methods: {
    updateProp() {
      this.$emit('update:propName', 'new value'); // генерация события update:propName
    }
  }
}
</script>

В данном примере, родительский компонент определяет свое состояние parentState и передает его в дочерний компонент через prop propName. Дочерний компонент может использовать это значение. При клике на кнопку в дочернем компоненте, он генерирует событие update:propName с новым значением, которое передается обратно в родительский компонент методом updateState. Таким образом, родительский компонент получает обновленное состояние и может его использовать.

В Vue.js версии 3.x, вместо применения props и emit, используется Composition API. Можно создать ref (ссылку на изменяемое значение) в родительском компоненте и передать его в дочерний компонент. Дочерний компонент будет иметь доступ к этому ref и сможет читать и изменять его значение.

// В родительском компоненте:
<template>
  <div>
    <child-component :propRef="parentRef"></child-component>
  </div>
</template>

<script>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  setup() {
    const parentRef = ref('example state'); // создание ref

    return { parentRef };
  },
};
</script>
// В дочернем компоненте (ChildComponent.vue):
<template>
  <div>
    <p>{{ propRef }}</p>
    <button @click="updateRef">Update state</button>
  </div>
</template>

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

export default {
  props: ['propRef'],
  methods: {
    updateRef() {
      this.propRef.value = 'new value'; // обновление значения ref
    }
  },
}
</script>

В данном примере, родительский компонент создает ref parentRef с начальным значением 'example state'. Затем это ref передается в дочерний компонент через prop propRef. В дочернем компоненте можно читать значение этого ref через this.propRef.value и изменять его, как это показано в методе updateRef.

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