Vue3.0 в настоящее время находится вне бета-версии и с открытым исходным кодом на github, который называетсяvue-next, в этой статье небольшой проект todoList, разработанный с помощью Vue2.6, преобразуется в Vue3.0, а также рассказывается о различиях между версиями 2.x и 3.x.
нажмите опытАдрес на гитхабе:TodoList версии Vue.js2.6,TodoList версии Vue.js3.0
Vue3.x адаптируется к большинству конфигураций компонентов Vue2.x, что означает, что у нас были некоторые элементы конфигурации для компонентов в Vue2.x, такие как:
export default {
name: 'test',
components: {},
props: {},
data () {
return {}
},
created(){},
mounted () {},
watch:{},
methods: {}
}
Его также можно адаптировать в Vue3.x, и соответствующие методы жизненного цикла также могут выполняться нормально, но основным ядром Vue3.x является введениеVue Composition API(составной API), который делает большую часть контента компонента доступным черезsetup()метод настройки, а Vue Composition API также можно использовать в Vue2.x, который необходимо использовать, установив @vue/composition-api:
npm install @vue/composition-api
...
import VueCompositionApi from '@vue/composition-api';
Vue.use(VueCompositionApi);
Далее в основном представлено сравнение старого и нового кода при использовании Vue Composition API для преобразования проекта todoList, разработанного с помощью 2.x.
Как создать проект Vue3.0
Сначала установите последнюю версию vue cli, обычно vue cli 4. После успешной установки вызовите:
vue create myapp
Создайте проект на основе Vue2.x, затем войдите в корневой каталог проекта и выполните:
vue add vue-next
Тогда он будет установлен автоматическиvue-cli-plugin-vue-nextПосле того, как надстройка будет завершена, проект myapp станет структурой проекта на основе версии Vue3.0Beta.
Инициализация корневого экземпляра:
Пройти в 2.xnew Vue()метод инициализации:
import App from './App.vue'
new Vue({
store,
render: h => h(App)
}).$mount('#app')
В 3.x Vue больше не является конструктором, который инициализируется через метод createApp:
import App from './App.vue'
createApp(App).use(store).mount('#app')
ref или реактивный вместо переменных в данных:
В версии 2.x некоторые данные текущего компонента определяются методом данных компонента:
...
data() {
return {
name: 'test',
list: [],
}
},
...
Создайте реактивные объекты по ref или реактивным в 3.x:
import {ref,reactive} from 'vue'
...
setup(){
const name = ref('test')
const state = reactive({
list: []
})
return {
name,
state
}
}
...
ref создает реактивный объект данных с заданным значением и присваивает начальное значение (int или string).reactive может напрямую определять сложные реактивные объекты.
Методы, определенные в method, также могут быть записаны в setup():
В методах 2.x для определения некоторых внутренних методов текущего компонента:
...
methods: {
fetchData() {
},
}
...
Определите и верните прямо в методе установки в 3.x:
...
setup(){
const fetchData = ()=>{
console.log('fetchData')
}
return {
fetchData
}
}
...
Невозможно использовать EventBus:
Взаимодействие компонентов реализовано в версии 2.x через метод EventBus:
var EventBus = new Vue()
Vue.prototype.$EventBus = EventBus
...
this.$EventBus.$on() this.$EventBus.$emit()
Удалено в 3.x$on, $offи другие методы (см.rfc), рекомендуется использоватьmittпрограмма вместо:
import mitt from 'mitt'
const emitter = mitt()
// listen to an event
emitter.on('foo', e => console.log('foo', e) )
// fire an event
emitter.emit('foo', { a: 'b' })
Поскольку 3.x больше не поддерживает способ установки глобального метода прототипа, вы можете передатьapp.config.globalProperties.mitt = () => {}строить планы.
Используйте реквизиты и это в setup():
В 2.x метод компонента может получить через него экземпляр текущего компонента и выполнить модификацию переменной данных, вызов метода, связь компонента и т. д., но в 3.x , setup() используется в beforeCreate и было вызвано созданное время, и то же самое, что и 2.x, нельзя использовать, но его можно получить, получивsetup(props,ctx)метод для получения экземпляра и реквизита текущего компонента:
export default {
props: {
name: String,
},
setup(props,ctx) {
console.log(props.name)
ctx.emit('event')
},
}
Обратите внимание, что это в ctx и 2.x не совсем то же самое, но выборочно предоставляет некоторые свойства, в основном в том числе[attrs,emit,slots].
смотреть, чтобы слушать изменения объекта
В версии 2.x watch можно использовать для отслеживания того, изменилось ли свойство объекта:
...
data(){
return {
name: 'a'
}
},
watch: {
name(val) {
console.log(val)
}
}
...
В 3.x в setup() вы можете использовать watch для прослушивания:
...
import {watch} from 'vue'
setup(){
let state = reactive({
name: 'a'
})
watch(
() => state.name,
(val, oldVal) => {
console.log(val)
}
)
state.name = 'b'
return {
state
}
}
...
В версии 3.x, если часы являются объектом-массивом, то при вызове метода array.push() для добавления фрагмента данных метод часов не сработает, и массив необходимо будет переназначить:
let state = reactive({
list: []
})
watch(
() => state.list,
(val, oldVal) => {
console.log(val)
}
)
state.list.push(1) // 不会触发watch
state.list = [1] // 会触发watch
Я не знаю, намеренно ли эта проблема была добавлена Vue3.x, и она будет проверена после выпуска официальной версии.
вычисленные вычисляемые свойства:
В версии 2.x:
...
computed: {
storeData () {
return this.$store.state.storeData
},
},
...
В 3.x:
...
import {computed} from 'vue'
setup(){
const storeData = computed(() => store.state.storeData)
return {
storeData
}
}
...
Конечно, для полного API Vue Composition студенты могут обратиться кДокументация. На данный момент Vue3.0 не выпустил официальную версию, поэтому многие способы использования и реализации могут быть неизвестны, но я все еще с нетерпением жду новых идей методов кодирования, представленных в новой версии.