15 минут, чтобы начать работу с vue3.0

Vue.js
15 минут, чтобы начать работу с vue3.0

Vue 3Официально еще не выпущен, ноAlphaверсия вышла.

Хотя официальный не рекомендует прямое использование в производственной средеVue 3, но учиться заранее всегда полезно.

Я кричала, что не могу больше учиться, но очень честно раскрыла руки.Vue 3Документация

Создать проект

VueОфициальный представитель очень заботится о том, чтобы предоставить репозиторий github, чтобы мы могли быстро испытатьVue 3Новые возможности:

git clone https://github.com/vuejs/vue-next-webpack-preview.git vue3-start
cd vue3-start
npm install or yarn intall

Когда среда разработки будет готова, запустите команду:

npm run dev

открыть в браузереhttp://127.0.0.1:8080, вы можете увидеть простую страницу счетчика:

langch

Откройте package.json, текущая версия vue:3.0.0-beta.2

Что нового в Vue 3

Vue 3Цели дизайна — быть быстрее, меньше и лучше поддерживатьсяTypeScript.

Некоторые из новых функций включают в себя:

1. API композиции 2. Несколько корневых элементов 3. Приостановка 4. Несколько V-моделей 5. Реактивность 6. Телепорт 7. Переход 8. Удалить фильтр 9. Конфигурация приложения

1. API композиции

Vue официально выпущенComposition APIОфициальный плагин , чтобы большинство пользователей моглиVue2.xнаслаждатьсяFunction Baseновый опыт.

пока вvue 3Не нужно устанавливать плагины отдельно, все работает из коробки.

ОткрытьApp.vue,ты увидишьsetup()метод:

<template>
  <img src="./logo.png">
  <h1>Hello Vue 3!</h1>
  <button @click="inc">Clicked {{ count }} times.</button>
</template>

<script>
import { ref } from 'vue'

export default {
  setup() {
    const count = ref(0)
    const inc = () => {
      count.value++
    }

    return {
      count,
      inc
    }
  }
}
</script>

<style scoped>
img {
  width: 200px;
}
h1 {
  font-family: Arial, Helvetica, sans-serif;
}
</style>

Composition APIЕсть два основных преимущества:

1. Четкая структура кода 2. Избавьтесь от повторяющейся логики

<template>
  <div class="counter">
    <p>count: {{ count }}</p>
    <p>NewVal (count + 2): {{ countDouble }}</p>
    <button @click="inc">Increment</button>
    <button @click="dec">Decrement</button>
    <p> Message: {{ msg }} </p>
    <button @click="changeMessage()">Change Message</button>
  </div>
</template>
<script>
import { ref, computed, watch } from 'vue'
export default {
  setup() {
    /* ---------------------------------------------------- */
    let count = ref(0)
    const countDouble = computed(() => count.value * 2)
    watch(count, newVal => {
      console.log('count changed', newVal)
    })
    const inc = () => {
      count.value += 1
    }
    const dec = () => {
      if (count.value !== 0) {
        count.value -= 1
      }
    }
    /* ---------------------------------------------------- */
    let msg= ref('some text')
    watch(msg, newVal => {
      console.log('msg changed', newVal)
    })
    const changeMessage = () => {
      msg.value = "new Message"
    }
    /* ---------------------------------------------------- */
    return {
      count,
      inc,
      dec,
      countDouble,
      msg,
      changeMessage
    }
  }
}
</script>

Если вы не хотите использоватьComposition API, вы также можете продолжать использовать2.xтрадиционный метод:

<template>
  <div class="counter">
    <p>count: {{ count }}</p>
    <p>NewVal (count + 2): {{ countDouble }}</p>
    <button @click="inc">Increment</button>
    <button @click="dec">Decrement</button>
    <p> Message: {{ msg }} </p>
    <button @click="changeMessage()">Change Message</button>
  </div>
</template>
<script>
export default {
  data() {
    return {
      count: 0,
      msg: 'some message'
    }
  },
  computed: {
    countDouble() {
      return this.count*2
    }
  },
  watch: {
    count(newVal) {
      console.log('count changed', newVal)
    },
    msg(newVal) {
      console.log('msg changed', newVal)
    }
  },
  methods: {
     inc() {
      this.count += 1
    },
    dec() {
      if (this.count !== 0) {
        this.count -= 1
      }
    },
    changeMessage() {
      msg = "new Message"
    }
  }

}
</script>

Приведенные выше два фрагмента кода полностью эквивалентны в листинге эффектов.

использоватьComposition APIПреимущество: позволяет нам лучше организовать наш код (state, methods, computed properties, watcherЖдать).

По мере роста компонентов важным вопросом становится организация нашего бизнес-кода, чтобы новые разработчики могли легко понять код, не занимая слишком много времени.

Раньше мы использовалиmixinдля повторного использования кода. Однако,mixinСамая большая боль в том, что нам нужно отслеживать состояния и методы в разных компонентах, что часто вносит определенную умственную нагрузку на разработку.mixinМожет перезаписать существующее состояние или методы в компоненте.

использоватьComposition APIУпростите повторное использование кода.

Мы также можем извлечь код повторяющихся функций:

// message.js
import { ref, watch } from "vue";
export function message() {
  let msg = ref(123);
  watch(msg, (newVal) => {
    console.log("msg changed", newVal);
  });
  const changeMessage = () => {
    msg.value = "new Message";
  };
  return { msg, changeMessage };
}

Используйте вышеуказанный компонент в других компонентах:

<template>
  <div class="counter">
    <p>count: {{ count }}</p>
    <p>NewVal (count + 2): {{ countDouble }}</p>
    <button @click="inc">Increment</button>
    <button @click="dec">Decrement</button>
    <p>Message: {{ msg }}</p>
    <button @click="changeMessage()">change message</button>
  </div>
</template>
<script>
import { ref, computed, watch } from 'vue'
import { message } from './common/message'
export default {
  setup() {
    let count = ref(0)
    const countDouble = computed(() => count.value * 2)
    watch(count, newVal => {
      console.log('count changed', newVal)
    })
    const inc = () => {
      count.value += 1
    }
    const dec = () => {
      if (count.value !== 0) {
        count.value -= 1
      }
    }
    let { msg, changeMessage } = message()
    return {
      count,
      msg,
      changeMessage,
      inc,
      dec,
      countDouble
    }
  }
}
</script>

2. Несколько корневых элементов

существуетVue 2, tempalte может принимать только один корневой элемент. Несмотря на то, что у нас всего два тега

, мы должны заключить их в один тег

:
<template>
  <div class="counter">
    <p> Count: {{ count }} </p>
    <button @click="increment"> Increment </button>
    <button @click="decrement"> Decrement</button>
  </div>
</template>

Для компиляции и передачи мы обычно добавляем корневой узел.

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

к счастью вVue 3Удалено это ограничение в:

Непосредственно в можно использовать любое количество тегов:

<template>
  <p> Count: {{ count }} </p>
  <button @click="increment"> Increment </button>
  <button @click="decrement"> Decrement </button>
</template>

При открытии шаблона с помощью VScode я вижу некоторыеlintошибка, это из-за официального плагинаeslint-plugin-vueНовый синтаксис шаблона пока не поддерживается.

3. Приостановка

SuspenseЯвляетсяVue 3Новые особенности.

Обычно взаимодействие front-end и back-end — это асинхронный процесс: по умолчанию мы предоставляем анимацию загрузки, которая используется вместе при возврате данныхv-ifдля управления отображением данных.

SuspenseПоявление значительно упрощает этот процесс: он обеспечиваетdefaultа такжеfallbackДва состояния:

<template>
  <Suspense>
    <template #default>
      <div v-for="item in articleList" :key="item.id">
        <article>
          <h2>{{ item.title }}</h2>
          <p>{{ item.body }}</p>
        </article>
      </div>
    </template>
    <template #fallback>
      Articles loading...
    </template>
  </Suspense>
</template>
<script>
import axios from 'axios'
export default {
  async setup() {
    let articleList = await axios
      .get('https://jsonplaceholder.typicode.com/posts')
      .then(response => {
        console.log(response)
        return response.data
      })
    return {
      articleList
    }
  }
}
</script>

4. Несколько v-моделей

мы все знаемv-modelsИспользуется для двусторонней привязки данных. Обычно используется с элементами формы. Иногда мы используем его в пользовательских компонентах.

Vue 2Разрешить только один на компонентеv-models. существуетVue 3, мы можем объединить любое количествоv-modelПривязка к нашим пользовательским компонентам:

<template>
  <survey-form v-model:name="name" v-model:age="age">
    {" "}
  </survey-form>
</template>

SurveyForm.vue:

<template>
    <div>
        <label>Name: </label>
        <input :value="name" @input="updateName($event.target.value)" />
        <label>Age: </label>
        <input :value="age" @input="updateAge($event.target.value)" />
    </div>
</template>
<script>
    export default {
      props: {
        name: String,
        age: Number
      },
      setup(props, { emit }) {
        const updateName = value => {
          emit('update:name', value)
        }
        const updateAge = value => {
          emit('update:age', +value)
        }
        return { updateName, updateAge }
      }
    }
</script>

5. Реактивность

Vue 2Отзывчивость 's уже велика, но в некоторых случаях есть некоторые проблемы:

<template>
  <div class="hello" @click="test">test {{list }} {{ myObj }}</div>
</template>
<script>
export default {
  name: "HelloWorld",
  data() {
    return {
      list: [1, 2],
      myObj: { name: "Preetish" }
    };
  },
  watch: {
    list: {
      handler: () => {
        console.log("watcher triggered");
      },
      deep: true
    }
  },
  methods: {
    test() {
      this.list[2] = 4;
      this.myObj.last = "HS";
      delete this.myObj.name;
    }
  }
};
</script>

Мы обнаружили, что черезthis.listНижний индекс для изменения элемента не сработаетwacherФункция прослушивателя, чтобы добиться этого, мы должны использоватьvue.set()илиvue.delete()эти методы.

пока вvue 3, нам не нужно прибегать к другим API:

export default {
  setup() {
    let list = ref([1, 2]);
    let myObj = ref({ name: "Preetish" });
    function myFun() {
      list.value[3] = 3;
      myObj.value.last = "HS";
      delete myObj.value.name;
    }
    return { myFun, list, myObj };
  },
};

6. Порталы

PortalsПредоставляет способ отобразить любой компонент на страницеDOMвозможности в узле. существуетVue 2, с помощьюportal-vueСторонние плагины для этого.

существуетvue 3Использовать непосредственно в:

<Teleport to="#modal-layer">
  <div class="modal">hello</div>
</Teleport>

— это специальный тег, предусмотренный в vue3 для созданияPortals.

Содержимое, которое появляется в середине , появится вtoВ указанном узле:

<div id="modal-target"></div>

Пока не работает в Альфе

7. Переход

я использовалv-enter-active, v-enter, v-enter-toГоловокружение в этих состояниях.

Vue 3 теперь более интуитивно понятен в именовании:v-enterсталv-enter-from,v-leaveсталиv-leave-from.

8. Удалить фильтр

Vue 3заброшенныйFilterиспользование, рекомендуется использовать вычисляемые свойства или методы для достижения:

<!-- vue 2.x -->
{{ date | format }}

<!-- vue 3.0 -->
{{ format(date) }}

9. Конфигурация приложения

существуетVue 2, если вы хотите использоватьuse(), mixin() , directive()и другие методы должны сотрудничать с глобальнымVueОбъект:

import Vue from "vue";
import App from "./App";

Vue.use(/* ... */);
Vue.mixin(/* ... */);
Vue.component(/* ... */);
Vue.directive(/* ... */);

new Vue({
  el: "#app",
  template: "<App/>",
  components: {
    App,
  },
});

существуетVue 3, изменился наcreateAppвернутьVueПример:

import { createApp } from "vue";
import App from "./App.vue";

const app = createApp(App);

app.use(/* ... */);
app.mixin(/* ... */);
app.component(/* ... */);
app.directive(/* ... */);

app.mount("#app");

заключительные замечания

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

В то же время некоторые другие функции, такие какSuspense, несколькоv-modelsЭто также принесет большое удобство в разработке.

В то же время более высокая производительность и меньший размер. Как это сделать, пожалуйста, обратитесь к другой статье, которую я написал:Автор Vue.js: Об истории создания Vue3.0