1 Совместное использование состояния
При доработке компонентов будет встречаться ситуация многокомпонентного совместного использования состояния.Vuex
Конечно, решить такую проблему можно, но что-то вродеVuex
Согласно официальной документации, если приложение недостаточно большое, лучше его не использовать во избежание громоздкого и избыточного кода.Сегодня мы представляем недавно добавленный vue.js 2.6.Observable API, используя этот API, мы можем справиться с простым обменом данными между компонентами.
В следующем примере мы создадимstore
, затем вApp.vue
Компоненты, предоставляемые store.js, используются вstore
иmutation
метод, и другие компоненты также могут использоваться таким же образом, чтобы несколько компонентов могли совместно использовать состояние данных.
Сначала создайте store.js, содержащийstore
иmutations
, которые используются для указания на данные и методы обработки соответственно.
import Vue from "vue";
export const store = Vue.observable({ count: 0 });
export const mutations = {
setCount(count) {
store.count = count;
}
};
затем вApp.vue
Вставьте этот store.js внутрь и используйте импортированные данные и методы в компоненте.
<template>
<div id="app">
<img width="25%" src="./assets/logo.png">
<p>count:{{count}}</p>
<button @click="setCount(count+1)">+1</button>
<button @click="setCount(count-1)">-1</button>
</div>
</template>
<script>
import { store, mutations } from "./store";
export default {
name: "App",
computed: {
count() {
return store.count;
}
},
methods: {
setCount: mutations.setCount
}
};
</script>
<style>
вы можете нажатьОнлайн ДЕМОПроверьте окончательный результат
2 Оптимизация производительности длинного списка
мы все должны знатьvue
пройдетobject.defineProperty
Захватите данные, чтобы реализовать реакцию представления на изменения данных, но иногда наши компоненты представляют собой чистое отображение данных, изменений не будет, нам это не нужно.vue
Чтобы украсть наши данные, в случае отображения большого количества данных, это может значительно сократить время инициализации компонента, как запретитьvue
Как насчет захвата наших данных? в состоянии пройтиobject.freeze
метод для заморозки объекта, когда замороженный объект больше не может быть изменен.
export default {
data: () => ({
users: {}
}),
async created() {
const users = await axios.get("/api/users");
this.users = Object.freeze(users);
}
};
Кроме того, следует отметить, что это только замороженныеusers
значение, ссылка не будет заморожена, когда нам нужноreactive
данные, мы можем датьusers
Назначение.
export default {
data: () => ({
users: []
}),
async created() {
const users = await axios.get("/api/users");
this.users = Object.freeze(users);
},
methods:{
// 改变值不会触发视图响应
this.users[0] = newValue
// 改变引用依然会触发视图响应
this.users = newArray
}
};
3 Удалите лишние стили
По мере того, как проект становится все больше и больше, если вы не обращаете внимания на написание, некоторые дополнительные CSS будут создаваться неестественным образом. Небольшие проекты — это хорошо. Когда проект становится больше, избыточный CSS будет становиться все больше и больше, что приведет к package становится все больше и больше, что влияет на производительность проекта, поэтому необходимо удалить эти избыточные css в формальной среде, вот рекомендуемая библиотекаpurgecss, поддержка CLI, JavascriptApi, Webpack и другие способы использования, с помощью этой библиотеки мы можем легко удалить избыточные css.
Я сделал тест,Онлайн ДЕМО
<h1>Hello Vanilla!</h1>
<div>
We use Parcel to bundle this sandbox, you can find more info about Parcel
<a href="https://parceljs.org" target="_blank" rel="noopener noreferrer">here</a>.
</div>
body {
font-family: sans-serif;
}
a {
color: red;
}
ul {
li {
list-style: none;
}
}
import Purgecss from "purgecss";
const purgecss = new Purgecss({
content: ["**/*.html"],
css: ["**/*.css"]
});
const purgecssResult = purgecss.purge();
в конечном итоге произвелpurgecssResult
Результат выглядит следующим образом, вы можете видеть избыточноеa
иul
Стиль этикетки ушел
4 слота с прицелом
Вы можете делать некоторые интересные вещи, эффективно используя слоты области, например, определяя базовый компонент макета A, который отвечает только за макет, независимо от логики данных, а затем определяя другой компонент B, отвечающий за обработку данных, и когда компонент макета А нужны данные, иди к Б. Возьми их внутрь. Предположим, однажды наш макет изменится, нам нужно изменить только компонент A, а не компонент B, чтобы мы могли полностью повторно использовать логику обработки данных компонента B. Я уже писал реальный случай об этом ранее. , вы можете нажатьздесьПроверять.
Одним из наиболее важных моментов здесь является то, что родительский компонент должен получить данные в дочернем компоненте.slot-scope
, который обеспечивает лучшую поддержку, начиная с vue 2.6.0.slot
иslot-scope
Альтернативы API атрибутам.
Например, мы называемcurrent-user
s компонент:
<span>
<slot>{{ user.lastName }}</slot>
</span>
ссылка на родительский компонентcurrent-user
, но хотите заменить фамилию на имя (первое слово имени иностранца - имя, а последнее слово - фамилия):
<current-user>
{{ user.firstName }}
</current-user>
Этот способ не сработает, потому чтоuser
Объект — это данные дочернего компонента, мы не можем получить его в родительском компоненте, в это время мы можем передатьv-slot
реализовать.
Сначала в дочернем компоненте поместитеuser
как<slot>
Атрибуты элементов привязаны к:
<span>
<slot v-bind:user="user">
{{ user.lastName }}
</slot>
</span>
После этого, когда на родительский компонент ссылаются, мы можем датьv-slot
Возьмите значение, чтобы определить имя реквизита слота, который мы предоставляем:
<current-user>
<template v-slot:default="slotProps">
{{ slotProps.user.firstName }}
</template>
</current-user>
Этот метод также имеет сокращенный синтаксис, который можно просмотретьСокращенный синтаксис для эксклюзивного слота по умолчанию, и, наконец, мы ссылаемся на следующий способ:
<current-user v-slot="slotProps">
{{ slotProps.user.firstName }}
</current-user>
по сравнению с тем, что было раньшеslot-scope
Код чище и проще для понимания.
5 Атрибут доставки событий
Детская обувь, написавшая высокоуровневые компоненты, могла столкнуться с ситуацией передачи обработанных атрибутов вниз, если атрибутов много, то их нужно передавать по одному, что очень недружелюбно и долго. пройти? (например, в реакции{...this.props}
)? ответv-bind
иv-on
.
Например, если есть базовый компонентBaseList
, только основная функция отображения списка, теперь мы хотим добавить функцию сортировки на этой основе, в это время мы можем создать компонент более высокого порядкаSortList
.
<!-- SortList -->
<template>
<BaseList v-bind="$props" v-on="$listeners"> <!-- ... --> </BaseList>
</template>
<script>
import BaseList from "./BaseList";
// 包含了基础的属性定义
import BaseListMixin from "./BaseListMixin";
// 封装了排序的逻辑
import sort from "./sort.js";
export default {
props: BaseListMixin.props,
components: {
BaseList
}
};
</script>
Вы можете увидеть удобство передачи свойств и событий вместо передачи их по одному.
6 функциональных компонентов
Функциональные компоненты не имеют состояния, не могут быть созданы и не имеют внутренних методов обработки жизненного цикла.Они очень легкие и имеют высокую производительность рендеринга.Они особенно подходят для компонентов, которые зависят только от внешней передачи и изменения данных.
Это написано следующим образом:
- существует
template
внутри этикеткиfunctional
- принимать только
props
ценность - ненужный
script
Этикетка
<!-- App.vue -->
<template>
<div id="app">
<List
:items="['Wonderwoman', 'Ironman']"
:item-click="item => (clicked = item)"
/>
<p>Clicked hero: {{ clicked }}</p>
</div>
</template>
<script>
import List from "./List";
export default {
name: "App",
data: () => ({ clicked: "" }),
components: { List }
};
</script>
<!-- List.vue 函数式组件 -->
<template functional>
<div>
<p v-for="item in props.items" @click="props.itemClick(item);">
{{ item }}
</p>
</div>
</template>
7 Мониторинг жизненного цикла компонентов
Например, есть родительский компонентParent
и подкомпонентыChild
, если родительский компонент слушает монтирование дочернего компонентаmounted
Просто выполните некоторую логическую обработку, обычный метод записи может быть следующим:
// Parent.vue
<Child @mounted="doSomething"/>
// Child.vue
mounted() {
this.$emit("mounted");
}
Вот особенно простой способ, дочерний компонент не нуждается в какой-либо обработке, просто нужно передать, когда ссылается на родительский компонент@hook
Для мониторинга код переписывается следующим образом:
<Child @hook:mounted="doSomething"/>
Конечно, можно не только контролироватьmounted
, другие события жизненного цикла, такие как:created
,updated
Ты можешь подождать, разве это не очень удобно~
Ссылка на ссылку: