6 полезных советов по разработке Vue

Vue.js

предисловие

В обычной разработке мы, возможно, использовали vue в течение длительного времени, но мы не обнаружили каких-то новых функций или навыков.Эта статья познакомит вас с часто используемыми навыками vue.

1. Обмен состояниями

При доработке компонентов вы столкнетесь с ситуацией многокомпонентного разделения состояния, Vuex конечно может решить такого рода проблемы, но как говорится в официальной документации Vuex, если приложение недостаточно большое, во избежание громоздкости и избыточный код, лучше не использовать его, сегодня мы представляем недавно добавленный Observable API в vue.js 2.6, Используя этот API, мы можем иметь дело с некоторым простым обменом данными между компонентами.

В следующем примере мы создадим хранилище вне компонента, а затем воспользуемся методами хранения и мутации, предоставляемыми store.js, в компоненте App.vue Аналогичным образом можно использовать и другие компоненты, так что несколько компоненты могут совместно использовать состояние данных.

Сначала создайте store.js, который содержит хранилище и мутацию, которые используются для указания на данные и методы обработки соответственно.

import Vue from "vue";

export const store = Vue.observable({ count: 0 });

export const mutations = {
  setCount(count) {
    store.count = count;
  }
};

Затем импортируйте этот store.js в App.vue и используйте импортированные данные и методы в компоненте.

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);
  }
};

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

export default {
  data: () => ({
    users: {}
  }),
  async created() {
    const users = await axios.get("/api/users");
    this.users = Object.freeze(users);
  },
  methods:{
    // 改变值不会触发视图响应this.data.users[0] = newValue
    // 改变引用依然会触发视图响应this.data.users = newArray
  }
};

3. Удалите лишние стили

По мере того, как проект становится все больше и больше, если вы не обращаете внимания на написание, некоторые дополнительные CSS будут создаваться неестественным образом. Небольшие проекты — это нормально. Когда проект становится больше, избыточный CSS будет становиться все больше и больше, что приведет к пакет становится все больше и больше, что влияет на производительность проекта, поэтому необходимо удалить эти избыточные css в формальной среде. Здесь мы рекомендуем библиотеку purgecss, которая поддерживает CLI, JavascriptApi, Webpack и другие методы. Через эту библиотеку , мы можем легко удалить избыточный css css.

npm i glob-all purify-css purifycss-webpack --save-dev
 
const PurifyCSS = require('purifycss-webpack')
const glob = require('glob-all')
plugins:[
    // 清除无用 css
    new PurifyCSS({
      paths: glob.sync([
        // 要做 CSS Tree Shaking 的路径文件
        path.resolve(__dirname, './src/*.html'), // 请注意,我们同样需要对 html 文件进行 tree shaking
        path.resolve(__dirname, './src/*.js')
      ])
    })
]

4. Функциональные компоненты

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

Это написано следующим образом:

Отметить функционал в теге шаблона Принимает только значения реквизита Теги скрипта не нужны

<!-- 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";

exportdefault {
  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>

5. Следите за жизненным циклом компонентов

Например, есть родительский компонент Parent и дочерний компонент Child. Если родительский компонент прослушивает смонтированный дочерний компонент, он будет выполнять некоторую логическую обработку. Обычный метод записи может быть следующим:

 // Parent.vue
<Child @mounted="doSomething"/>

// Child.vue
mounted() {
  this.$emit("mounted");
}

Вот особенно простой способ.Дочерний компонент не нуждается в какой-либо обработке, и его нужно только отслеживать через @hook при обращении к родительскому компоненту.Код переписывается следующим образом:

<Child @hook:mounted="doSomething"/>
<Child @hook:updated="doSomething"/>

Конечно, можно следить не только за смонтированным, но и за другими событиями жизненного цикла, такими как создание, обновление и т.д., это очень удобно~

Другой пример — обычное событие выгрузки привязки:

window.addEventListener('resize',this.handleResize)
this.$on('hook:destroyed',() => {
    window.removeventListener('resize',this.handleResize)
})

Для получения дополнительной информации об использовании хуков (useMounted, useComputed) см. vue-hookисходный код

6. Первоначальное немедленное исполнение Watch

При просмотре переменной она не будет выполняться при инициализации, как в следующем примере, ее нужно один раз вызвать вручную при ее создании.

created() {
  this.fetchUserList();
},
watch: {
  searchText: 'fetchUserList',
}

Вышеприведенный метод можно использовать, но он очень хлопотный.Мы можем добавить немедленный атрибут, чтобы он срабатывал автоматически во время инициализации (не нужно писать created для вызова), и тогда приведенный выше код можно упростить до:

watch: {
  searchText: {
    handler: 'fetchUserList',
    immediate: true
  }
}

Суммировать

Выше приведены часто используемые навыки разработки Vue, я надеюсь помочь вам