#查看脚手架版本,确保vue/cli的版本在4.5.0以上
vue --version
vue -V
#安装或升级你的@vue/cli
npm install -g @vue.cli
##创建项目
vue create vue_test
## 启动
cd vue_test
npm run serve
npm init vite-app vue3_test_vite
#安装依赖
yarn
# 启动
# 这里后面填,并没有启动成功
官方文档:https://vitejs.cn/guide/why.html#why-not-bundle-with-esbuild
//导入的不是vue的构造函数,是一个名为createApp的工厂函数
import { createApp } from 'vue'
import App from './App.vue'
createApp(App).mount('#app')
/*
createApp(App).mount('#app')
替换了这句
const vm = new Vue({
render:h=>h(App)
});
vm.$mount('#app')
*/
这个就是createApp
的返回,类似v2的vm,但是比vm更轻量
mount
就是挂载组件,只有挂载了App
,这个组件才会显示,同时也可以调用unmount
去卸载组件
vue3的初始化,已经不兼容Vue2的 new Vue({})的写法了,import的直接是undefined
目前vue的插件是支持vue2/vue3的,无需新下载版本
composition api :组合式api
文档地址: https://v3.cn.vuejs.org/guide/composition-api-introduction.html
setup
是所有Composition api(组合api) 表演的舞台可以访问到
setup中的属性,方法不能访问到
vue2.x配置(data,methods,computed)setup的第一种用法
<template>
<h1>我是setup测试</h1>
<h1>个人信息</h1>
<h2>{{name}}</h2>
<h2>{{age}}</h2>
<button @click="sayHello">sayHello</button>
</template>
<script>
export default {
name: 'App',
//这里会丢失响应式,只是做一个演示
setup(){
let name = "花花";
let age = 18;
function sayHello() {
alert(`我的名字是${name},我今年${age}岁`)
}
return {
name,age,sayHello
}
}
}
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
setup的第二种用法
<template>
<h1>我是setup测试</h1>
<h1>个人信息</h1>
<h2>{{ name }}</h2>
<h2>{{ age }}</h2>
<button @click="sayHello">sayHello</button>
</template>
<script>
import {h} from "vue";
export default {
name: 'App',
setup() {
return ()=> h("h1","花花")
}
}
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
function sayHello() {
name = "花花2";
age = 20;
console.log(name,age)
// alert(`我的名字是${name},我今年${age}岁`)
}
实际上是修改了,但是因为不是响应式数据,视图不刷新
setup(){
let name = ref("花花");
let age = ref(18);
function sayHello() {
console.log(name,age)
}
ref包裹的 实际上返回了一个RefImpl
引用实现类,官网原话是响应式引用
/*
* 可以通过这个来修改变量
*/
function sayHello() {
name.value = "花花2";
age.value = 20;
}
完整代码
<template>
<h1>我是setup测试</h1>
<h1>个人信息</h1>
<h2>{{ name }}</h2>
<h2>{{ age }}</h2>
<button @click="sayHello">sayHello</button>
</template>
<script>
import {ref} from "vue";
export default {
name: 'App',
setup(){
let name = ref("花花");
let age = ref(18);
function sayHello() {
name.value = "花花2";
age.value = 20;
console.log(name,age)
}
return {
name,age,sayHello
}
}
}
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
对象
的处理let job = ref({
jobs:"前端开发工程师",
salary:'3k'
})
function sayHello() {
console.log(job.value)
}
总结
const xxx = ref(initValue)
引用对象(refrence对象,简称reg对象)
xxx.value
<div>{{xxx}}</div>
基本类型
,也可以是对象
Object.defineProperty()
的get
和set
完成的reactive
<template>
<h1>我是setup测试</h1>
<h1>个人信息</h1>
<h2>{{ name }}</h2>
<h2>{{ age }}</h2>
<button @click="sayHello">sayHello</button>
<h2>职业:{{job.jobs}}</h2>
<h2>薪水:{{job.salary}}</h2>
</template>
<script>
import {ref} from "vue";
export default {
name: 'App',
setup(){
let name = ref("花花");
let age = ref(18);
let job = ref({
jobs:"前端开发工程师",
salary:'3k'
})
function sayHello() {
name.value = "花花2";
age.value = 20;
job.value.salary = '6k'
job.value.jobs = "全栈开发工程师"
console.log(name,age)
console.log(job.value)
}
return {
name,age,sayHello,job
}
}
}
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>