предисловие
Последняя статья об интервью Vue (Какие ответы интервьюер хочет услышать во время интервью) упомянул различные методы передачи стоимости компонента, в этой статье объясняется, как использовать несколько методов передачи стоимости.
props, $emit, eventbus, vuex, $parent / $children / ref, sessionStorage, localStorage, параметры маршрутизации (также передача значений). Эти методы передачи значений слишком распространены, и каждый, кто использует vue, не может знаете, поэтому в этой статье мы не будем объяснять их по одному, а сейчас представим несколько способов передачи значений, которые не распространены в обычное время. Если у вас есть какие-либо вопросы по вышеизложенному, вы можете оставить сообщение в комментариях, спасибо, что нашли время прочитать мою работу, пожалуйста, исправьте ее.
1. provide/ inject
Родительский компонент предоставляет переменные через Provide, а затем вводит переменные в дочерний компонент через inject.
Примечание. Независимо от того, насколько глубоко здесь вложены подкомпоненты, до тех пор, пока вызывается inject, данные в провайдере могут быть введены, не ограничиваясь возвратом данных из свойства props текущего родительского компонента.
Предполагая, что A является родительским компонентом B, а C являются подкомпонентами A, а D является подкомпонентом B, затем используйте предоставление для определения переменных в компоненте A, а переданные значения могут быть получены в компоненте A. Компоненты B, C и D путем ввода. (Переменные, определенные в условии, нельзя использовать в родительских компонентах)
Примечание: предоставление и внедрение в основном предоставляют варианты использования для библиотек плагинов/компонентов более высокого порядка. Его не рекомендуется использовать непосредственно в коде приложения. (Официальное описание документа)
родительский компонент
export default {
data () {
return {}
},
provide: {
index: '来自index的数据'
}
}
Подсборка
export default {
data () {
return {}
},
inject: ['index'] // 直接可以在页面使用index或在js中进行赋值
}
2. $attrs
Вызовите дочерний компонент 3 в родительском компоненте A:<custom-three :custom="custom" :custon="custon" />, подкомпонент три использует реквизиты для получения, а значение, которое не получено подкомпонентом с помощью реквизитов, может использовать $attrs для получения переданного значения, то есть третий компонент делится на следующие случаи
- Когда реквизиты: ['custom','custon], $attrs = {};
- Когда реквизит: ['custom'], $attrs = {custon: 'ton'};
- Реквизиты: [] Когда, $ attrs = {custom: 'Tom', cudon: 'Ton'};
На этом этапе введите четыре подкомпонента в три компонента и используйте v-bind для привязки $attrs к компоненту.<custom-four v-bind="$attrs" />Вы можете использовать props или $attrs для получения в четыре, и его можно передавать все время в соответствии с этим правилом.
А переменные, которые не используются компонентом, будут отображаться в html-структуре, например:
<div custon="ton">
<p>three---tom</p> >
<p>attr---{}</p>
</div>
Добавление inheritAttrs к дочернему компоненту может скрыть custon="ton" тега div. Значение inheritAttrs по умолчанию равно true, и его можно скрыть, установив для него значение false. Примечание. Установка для inheritAttrs значения false не влияет на использование $attrs.
3.$listeners
2 описывает использование $attrs для передачи значения родительского компонента дочернему компоненту при каждом поколении.Слушатели $listeners в этом разделе предназначены для передачи метода от родительского компонента дочернему компоненту при каждом поколении.При вызове дочернего компонента , значение дочернего компонента отделяется и передается родительскому компоненту.
Сначала вызовите дочерний компонент 3 в родительском компоненте A:<custom-three @customEvent="customEvent" />, В настоящее время используйте $listeners в подкомпоненте A для получения, получения объекта {customEvent: function(){...}}, вызовите подкомпонент четыре в трех компонентах и используйте v-on для привязки $listeners к подкомпоненту ` `, в настоящее время вы можете напрямую получить доступ к customEvent в четвертом подкомпоненте или использовать $listeners для доступа к customEvent.
родительский компонент А
<template>
<div>
<custom-three :custom="custom" :custon="custon" @customEvent="customEvent"></custom-three>
</div>
</template>
<script>
import customThree from './chuanzhi/three'
export default {
data () {
return {
custom: 'tom',
custon: 'ton'
}
},
components: {
customThree
},
mounted () {},
methods: {
customEvent(data) {
console.log('data', data)
}
}
}
</script>
дочерний компонент три
<template>
<div>
<p>three---{{ custom }}</p>
<p>attr---{{$attrs}}</p>
<p>-------------------------------------</p>
<custom-four v-bind="$attrs" v-on="$listeners"></custom-four>
</div>
</template>
<script>
import customFour from './four'
export default {
data() {
return {}
},
components: {
customFour
},
props: ['custom'],
inheritAttrs:false
created() {
console.log('1', this.$listeners)
}
}
</script>
подкомпонент четыре
<template>
<div>
<p>four---{{ custon }}</p>
<p>attr---{{$attrs}}</p>
<el-button @click="fashe">发射</el-button>
</div>
</template>
<script>
export default {
data() {
return {}
},
props: ['custon'],
inheritAttrs:false
created() {
console.log('2', this.$listeners)
},
methods: {
fashe() {
this.$emit('customEvent', 'piupiupiu')
}
}
}
</script>
observable реализует управление состоянием
observable делает объект отзывчивым. Он используется внутри Vue для обработки объекта, возвращаемого функцией данных.
Возвращенный объект можно использовать непосредственно в функциях рендеринга и вычисляемых свойствах, и он будет запускать соответствующие обновления, когда что-то изменится. Также может использоваться как минимальное межкомпонентное хранилище состояний для простых сценариев:
Вызовите setCount в компоненте 1, чтобы увеличить или уменьшить счетчик на 1, счетчик, вызываемый в каждом компоненте, будет изменен, и будет запущено обновление компонента.
файл store.js
import vue from 'vue';
export const store = vue.observable({count: 0});
export const mutation = {
setCount( count ){
store.count = count;
}
}
Компонент 1
<template>
<div class="hello">
<p @click="setCount(testCount + 1)">+</p>
<p @click="setCount(testCount - 1)">-</p>
<test />
<p>{{testCount}}</p>
</div>
</template>
<script>
import test from './test'
import { store, mutation} from './store.js'
export default {
name: 'HelloWorld',
components: {
test
},
methods: {
setCount: mutation.setCount
},
computed: {
testCount(){
return store.count
}
}
}
Компонент 2
<template>
<div>test{{testCount}}</div>
</template>
<script>
import { store } from './store.js';
export default {
computed: {
testCount(){
return store.count
}
}
}
</script>