В последнее время столкнулся с проблемами в сортировке кода в проекте и передаче данных между компонентами, поэтому сделал такое резюме, если что не так прошу поправить.
Как родительские компоненты передают данные дочерним компонентам
Родительский компонент может пройтиProp
Передайте данные дочерним компонентам.
Здесь следует отметить следующее:
-
Prop
Это односторонняя привязка: когда свойство родительского компонента изменяется, оно будет распространяться на дочерний компонент, но не наоборот. Это необходимо для предотвращения непреднамеренного изменения состояния родительского компонента дочерними компонентами, что предотвращает неразборчивость потока данных приложения. -
Каждый раз, когда родительский компонент обновляется, все дочерние компоненты
Prop
будет обновлено до последнего значения. Это означает, что вы не должны изменять свойства внутри дочерних компонентов. Если вы это сделаете, Vue предупредит вас в консоли.
В двух случаях легко устоять перед искушением изменить данные в свойстве:
-
Prop
После передачи в качестве начального значения дочерний компонент хочет использовать его как локальные данные;
Решение: определите локальную переменную и используйтеprop
чтобы инициализировать его значением:
props: ['initialCounter'],
data: function () {
return { counter: this.initialCounter }
}
-
Prop
Он передается как необработанные данные и обрабатывается подкомпонентами в другие выходные данные.
Обходной путь: определите вычисляемое свойство, которое обрабатывает значение свойства и возвращает:
props: ['size'],
computed: {
normalizedSize: function () {
return this.size.trim().toLowerCase()
}
}
PS: содержимое вышеvue
В документе сказано, что я просто вытащил те проблемы, с которыми столкнулся в проекте.Связь
Каштан:
// 父组件 index.vue
<template>
<div class="content">
<child :lists="lists"></child>
</div>
</template>
<script>
import child from './child.vue';
export default {
components: {
child
},
data() {
return {
lists: []
};
},
mounted() {
this.lists = [{
name: '01',
content: 'hi,'
}, {
name: '02',
content: 'my name is Ellyliang'
}];
}
};
</script>
// 子组件 child.vue
<template>
<ul class="content">
<li v-for="(list, index) in getLists" :key="index" v-html="list.name + list.content"></li>
</ul>
</template>
<script>
export default {
props: ['lists'],
data() {
return {
getLists: this.lists
};
},
mounted() {
this.getLists.push({
name: '03',
content: '不要在乎内容,我就是测试'
});
}
};
</script>
Как дочерние компоненты передают данные родительским компонентам
Подкомпоненты доступны черезvm.$emit
Передать данные родительскому компоненту
vm.$emit
Что это такое
Запускает событие в текущем экземпляре. Дополнительные параметры передаются обратному вызову слушателя.Связь
Каштан:
// 父组件 index.vue
<template>
<div class="content">
<child :lists="lists" @listenToChild="getChildMsg"></child>
</div>
</template>
<script>
import child from './child.vue';
export default {
components: {
child
},
data() {
return {
lists: []
};
},
mounted() {
this.lists = [{
name: '01',
content: 'hi,'
}, {
name: '02',
content: 'my name is Ellyliang'
}];
},
methods: {
getChildMsg(val) {
alert(val); // 'hello'
}
}
};
</script>
// 子组件 child.vue
<template>
<div class="content">
<ul class="lists">
<li v-for="(list, index) in getLists" :key="index" v-html="list.name + list.content"></li>
</ul>
</div>
</template>
<script>
export default {
props: ['lists'],
data() {
return {
getLists: this.lists
};
},
mounted() {
this.getLists.push({
name: '03',
content: '不要在乎内容,我就是测试'
});
setTimeout(() => {
this.$emit('listenToChild', 'hello');
}, 15000);
}
};
</script>
Удобно ли дочерним компонентам передавать данные родительским компонентам? Метод реализации находится в дочернем компоненте$emit
данные, а затем передавать события в родительский компонент@事件名
получить значение.
Event Bus
Метод шины событий может обрабатывать не только передачу компонентов «родитель-потомок», передачу компонентов «потомок-родитель», но также обрабатывать передачу значений между горизонтальными компонентами. Способ сделать это в глобальномnew
Одинvue
экземпляр, а затем передать значение вbus
, то естьlet bus = new vue();
. через этот глобальныйbus
середина$emit
, $on
И так далее, чтобы добиться передачи данных. С этим есть проблема, потому чтоevent bus
Удобно обрабатывать передачу данных, куда бы они ни пошли, что приводит к злоупотреблениям, что затрудняет понимание кода.
Реализация шины событий
let bus = new Vue();
// 触发组件 A 中的事件
bus.$emit('id-selected', 1);
// 在组件 B 创建的钩子中监听事件
bus.$on('id-selected', function (id) {
// ...
});
Информацию об упаковке и использовании конкретных компонентов см.vue-bus.
другой путь
Кроме трех вышеперечисленных способов, есть ещеvuex
Чтобы разобраться с передачей данных, я не обращался, всем должно быть интересно и узнать самому.