打开官网,点击快速上手,在html文件中引入vue.global.js文件
在body标签里:首先是容器,在script标签里用 Vue.createApp方法,用setup配置项存放数据和方法,setup里需要返回值。在Vue.createApp后面将内容挂载在容器内用mount("#id")
{{msg}}
如果想创建一个复杂的数据类型,可以使用reactive,并且将其返回return
setup() { const web = Vue.reactive({ title: "你好" }) return { msg: '阿衡', web } }
简写:不写Vue,可以使用解构赋值
const { createApp, reactive } = Vue
同样,在官网找到vue.esm-browser.js文件并引入
import { createApp, reactive } from './vue.esm-browser.js'
1.ref用于存储基本数据类型,在修改值时,需要.value,并且记得要返回
引入
import { createApp, reactive, ref } from './vue.esm-browser.js'
定义和修改(setup里)
const num = ref(11) num.value = 122
返回
return { num }
2.reactive用于复杂的数据类型,在修改值时可以直接修改
在标签中用v-on或者@绑定事件
在setup里写函数
const edit = () => { web.url = "22222" }
返回值
在标签里用v-show
{{web.url}}
在标签里使用v-if或v-else或v-else-if
可以对value,src,class进行绑定,简写形式是:value
![]()
你好
对于数组,可以v-for="value in data.number";对于对象,可以v-for="(value,key,index) in data.user";
在使用过程中,尽量加上:key="value.id"
- {{value}}
- {{index}}->{{value}}
- {{key}}->{{value}}->{{index}}
- {{index}}->{{value.name}}
可以对input类型的text,radio,checkbox和select进行双向数据绑定,都是通过value进行存储
在setup里的数据里,写一个复杂数据类型存储
选项1 选项2 多选1 多选2 多选3
2.8v-model的修饰符
.lazy是失去焦点或按下回车后渲染
.number是将输入框的值转化为数字类型
.trim是去掉首尾空格
在setup里
const data = reactive({ title: "阿衡", html: "www.baidu.com" })
首先引入computed
在利用属性将计算属性挂载上去,用computed(()=>{})箭头函数的形式
{{add}}
导入watch
import { createApp, reactive, watch } from './vue.esm-browser.js'
监听某个数据
const data = reactive({ year: "2023" }) watch(data, (newValue, oldValue) => { console.log() })
监听某个对象的属性(范围更小)
const data = reactive({ year: "2023" }) watch(() => data.year, (newValue, oldValue) => { console.log() })
综合: import { createApp, reactive, watch } from './vue.esm-browser.js' createApp({ setup() { const data = reactive({ year: "2023" }) watch(data, (newValue, oldValue) => { console.log() }) watch(() => data.year, (newValue, oldValue) => { console.log() }) return ({ data }) } }).mount(".id")
同样还是先引入watchEffect,在setup里直接使用watchEffect即可
import { createApp, reactive, watchEffect } from './vue.esm-browser.js' createApp({ setup() { const data = reactive({ year: "2023" }) watchEffect(()=>{ // 操作数据 }) return ({ data }) } }).mount(".id")
打开命令行,进入到所需要创建的文件夹里
创建
npm create vite@latest
命名项目名
Project name: ... demo
进入项目文件夹
cd demo
安装
npm install
运行
npm run dev
最后常用的是
之后删除一些没用的文件
1.style.css
2.components下的组件
3.打开main.js,删除style.css 的引入
4.打开App.vue,删除所有,只留下模板
将导入和setup里的内容直接搬过来即可,不要return
将html结构直接放在template标签里即可
{{web.url}}
{{num}}
在父组件:
在使用子组件标签时,如果只是普通的字符串,直接传过去就可以
如果是一个对象,则利用v-bind绑定数据,在script里创建对象,推荐reactive
在子组件:
普通的字符串,用defineProps里的数组接收
如果是对象,要对对象的那个属性进行限制
header
footer
在子组件中:
首先声明一下需要传递的数据的名称,用defineEmits
然后再传递数据,用emits,第一个参数与声明时的相对应,第二个参数写需要传递的参数
ps:在可以通过自定义事件来决定传递数据的时机
header
在父组件中:
在使用子组件标签时,增加自定义事件,属性名是传递过来的数据名称,属性值是父组件内自己定义的函数,用来处理数据
在自定义函数中,用箭头函数的参数接收传递过来的数据
此方法只能用于父类(或祖先类)组件向子类(孙子类)组件传递参数
在父类(或祖先类)组件中:
可以传递响应式数据,ref,函数等
传递数据的一方需要引入provide,并定义好需要传递的数据,再通过provide("传递名",传递的数据)
在子类(孙子类)组件中:
先引入inject,再用inject("传递名")来获取数据
作用:我们再子组件中可以将父组件所定义的一些模板片段插入到子组件的特定位置
在父组件中:
不需要引入其他文件,只需要在使用子组件标签的时候,用子组件标签包裹需要传递的代码片段(html代码)
1.匿名插槽
2.具名插槽(简写形式:#)
需要用一个template标签包裹,并且用v-slot:或者#取名
在子组件中:
同样不需要引入其他文件,只需要在template标签里,找到需要放的位置,用slot标签引用即可
1.匿名插槽
header
2.具名插槽(在slot标签属性指明插槽名即可)
footer
作用:子组件向父组件传递数据,并在父组件定义的模板中渲染
根据上一个具名插槽的案例
在子组件中:
在属性里加入要传递的数据
footer
在父组件中:
1.在取名处用=“数据名”的形式,可以通过{{数据名.子组件定义的属性}}来进行使用
2.还可以通过解构的方式,#插槽名={子组件定义的属性},在使用时,可以直接{{子组件定义的属性}}
作用:原本是响应式数据(对象),可以单独一个属性或者全部属性,拿出来单独变成响应式数据(一个属性就是一个响应式数据)
1.将全部属性变为响应式数据
首先引入toRefs,再利用解构赋值和toRefs方法,将响应式数据(对象)的全部属性转化
2.将个别属性变为响应式数据
首先引入toRef,再利用toRef方法,toRef(需要转换的响应式对象,“需要转换的属性”)
pinia是一个轻量级的状态管理库,可以全局状态管理,简化组件间的通信,状态持久化(可以将状态保存在本地存储)
进入你创建项目的文件夹中,利用管理员身份打开终端,输入命令行
npm install pinia
安装完成后你可以在package.json文件中看到pinia的版本号
然后再mian.js文件中:先引入pinia,再创建pinia实例,最后使用app.use(pinia)将pinia实例注册到vue应用中
ps:需要更改一下app创建实例的方式
import { createApp } from 'vue' import { createPinia } from 'pinia' import App from './App.vue' const pinia = createPinia() // createApp(App).mount('#app') const app = createApp(App) app.use(pinia) app.mount('#app')
store是用来集中存储和管理组件之间共享状态的仓库
首先在src文件下,创建一个stores文件,里面存放仓库文件
在仓库文件中,引入ref,reactive,再引入defineStore从pinia中
用defineStore()方法创建仓库,第一个参数是仓库的id(唯一标识),第二个参数是setup函数(也可以使用option函数)
最后将仓库导出,用export ,其中仓库名是有规范的,use+唯一标识符+Store
import { ref, reactive } from "vue" import { defineStore } from "pinia" export const useWebStore = defineStore("web", () => { const web = reactive({ name: "阿衡", url: "www.baidu.com" }) const user = ref(1000) const userAdd = () => { user.value++ } return ({ web, user, userAdd }) })
首先引入仓库,用仓库名引出
再创建仓库实例即可
在全局安装pinia-plugin-persistedstate插件
npm i pinia-plugin-persistedstate
在main.js文件中,引入插件,并将插件注册到pinia中
import { createApp } from 'vue' import { createPinia } from 'pinia' import App from './App.vue' import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'//引入 const pinia = createPinia() pinia.use(piniaPluginPersistedstate)//注册 // createApp(App).mount('#app') const app = createApp(App) app.use(pinia) app.mount('#app')
将仓库变为持久化仓库,打开仓库文件setup函数后面添加一个配置项 persist: true
import { ref, reactive } from "vue" import { defineStore } from "pinia" export const useWebStore = defineStore("web", () => { const web = reactive({ name: "阿衡", url: "www.baidu.com" }) const user = ref(1000) const userAdd = () => { user.value++ } return ({ web, user, userAdd }) }, { persist: true })
使用这个插件的好处:
1.自动状态同步化
2.易用性