vue啊哈哈哈哈哈哈哈哈
day6_vue
1js发展过程
原生js ---->js扩展库 jQuery ------> js框架 (减少程序中的dom操作)
前端常见框架
React angularJs Vue.js
2VUE
https://cn.vuejs.org/ 官网
VUE3 版本 使用组合式API
3vue基本效果
减少dom操作
<!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>title</title> </head> <body><div id="app"><h1>我的变量的值:{{myMsg}}</h1> </div> </body> <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script> <script> /*1. 创建一个Vue实例2. 创建使用的变量3. 变量与页面元素 通过vue的标记 关联4. 自动渲染页面*/ const { createApp, ref } = Vue createApp({setup(){let myMsg = "jack";return{myMsg}}}).mount('#app') </script> </html>
4vue原理
<!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>title</title> </head> <body><h1 id="myTitle"></h1><input id="myText" type="text"/> </body> <script>//document.getElementById('myTitle').innerHTML = 'hello world'; /*1.vue响应式数据的原理改页面页面自动渲染 数据劫持 vue2核心原理(框架加载时如果对象复杂 比较慢) (扩展vue对象属性 改get/set方法 隐藏dom操作)(数字 字符串 bol值)代理对象 vue3核心原理(对象属性代理+数据劫持)(数组 自定义对象) 2.虚拟dom生成虚拟dom模板 根据根标签生成减少页面渲染次数 提高显示效率 减少卡顿 */ let myJson = {name:"jack",address:"北京"};//myJson.address = "beijing";//// Object.defineProperty(myJson,'address',{// get(){// console.log("尝试读取address属性的值");// },// set(val){// console.log("尝试设置address属性的值"+val);// document.getElementById('myTitle').innerHTML = val;// }// }) // myJson.address = "北京" let newJson = new Proxy(myJson,{get(target,prop){console.log(`读取属性${prop}:`+target[prop]);},set(target,prop,value){console.log(`尝试设置属性${prop}:`+value);if(prop=="address"){document.getElementById('myTitle').innerHTML = value;}if(prop=="name"){document.getElementById('myText').value = value;}}})//newJson.address = "北京"// console.log(myJson);// console.log(newJson);newJson.address = "北京2"newJson.name = "张三" document.getElementById('myTitle').innerHTML = 1;document.getElementById('myTitle').innerHTML = 2;document.getElementById('myTitle').innerHTML = 3; </script> </html>
5js模块化语法
/* export 导出 import 导入 两种导入导出方式 默认导入导出 export default myName; import name from './js/myjs.js' 命名导入导出 export {myName,myJson,myFun} import { myName,myFun } from './js/myjs.js' 数量可以不对应 名称必须对应 */
6vue中创建变量和函数的语法
变量和函数 需要属于vue对象 变量和函数 都要写在setup函数中 才能与vue有关系
//ref 简单类型数据(使用数据劫持)//js中 需要添加.value//页面中 直接使用变量名const msg2 = ref("hello world2")const msg3 = ref({name:"张三",age:18})//ref 可以兼容复杂数据类型//reactive 复杂类型数据(使用代理对象)//js中 不需要添加.value//页面中 直接使用变量名const msg4 = reactive({name:"张三",age:18})//普通变量let msg = "hello world"
函数const myFun = ()=>{console.log("myFun");} myFun()
<!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>title</title> </head> <body><div id="myapp">{{msg2}}名字:{{msg3.name}}<br>年龄:{{msg3.age}}<br> 名字:{{msg4.name}}<br>年龄:{{msg4.age}}<br></div> </body> <script type="module">import { createApp,ref,reactive} from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js' createApp({setup(){//使用 变量 函数//初次渲染生效 后续监听到变化时 不生效let msg = "hello world"//使用vue响应式数据函数//ref 简单类型数据(使用数据劫持)//js中 需要添加.value//页面中 直接使用变量名 //reactive 复杂类型数据(使用代理对象)//js中 不需要添加.value//页面中 直接使用变量名//如果是 数字 bol值 字符串 //vue响应式变量 修饰符使用const//记录程序执行过程的变量 使用letconst msg2 = ref("hello world2")const msg3 = ref({name:"张三",age:18})const msg4 = reactive({name:"张三",age:18}) console.log(msg3);msg2.value = "hello world3"msg3.value.name = "李四"msg4.name = "王五" //函数方式与之前相同const myFun = ()=>{console.log("myFun");} myFun() return {//如果变量 函数 需要在页面中使用,则需要返回 对外暴漏msg,msg2,msg3,msg4}}}).mount('#myapp') </script> </html>
7vue指令(页面如何与变量和函数关联)
注意:各种模板语法 要在页面中使用 必须对外暴漏变量和函数
7.1插值表达式
1.插值表达式 {{变量}} 显示文本2.v-html 可以解析html标签 不建议用 (在js中 不要涉及dom操作)
<!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>title</title> </head> <body><div id="myapp">欢迎<b>{{name}}</b>登录{{num1+num2}}<br><span v-html="name2"></span> </div> </body> <script type="module">import { createApp,ref } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js' /*各种模板语法 要在页面中使用 必须对外暴漏变量和函数1.插值表达式 {{变量}} 显示文本2.v-html 可以解析html标签 不建议用 (在js中 不要涉及dom操作)*/ createApp({setup(){//使用 变量 函数 const name = ref('rose')const name2 = ref('<b>rose</b>')const num1 = ref(1)const num2 = ref(2)return {//如果变量 函数 需要在页面中使用,则需要返回 对外暴漏name,num1,num2,name2}}}).mount('#myapp') </script> </html>
7.2属性绑定
v-bind 属性绑定给html的属性 绑定变量v-bind:value="变量" :value="变量"常用属性值 字符串 数字 (禁用 只读)布尔值class属性(知道即可) 可以配置json对象 每个样式单独配置bol决定是否显示
<!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>title</title><style>.mydiv{width: 100px;height: 100px;background-color: red;}.mydiv2{border: 1px solid black;}</style> </head> <body><div id="myapp"><input :type="inputType" :value="msg" :disabled="inputStatus"><div :class="{'mydiv':div1status,'mydiv2':div2status}"></div></div> </body> <script type="module">import { createApp,ref } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'/*v-bind 属性绑定给html的属性 绑定变量v-bind:value="变量" :value="变量"常用属性值 字符串 数字 (禁用 只读)布尔值class属性 可以配置json对象 每个样式单独配置bol决定是否显示*/createApp({setup(){const div1status = ref(false)const div2status = ref(false)//使用 变量 函数//bol 数字 字符串const msg = ref(1)const inputType = ref("button")const inputStatus = ref(false)return {//如果变量 函数 需要在页面中使用,则需要返回 对外暴漏msg,inputType,inputStatus,div1status,div2status}}}).mount('#myapp')</script> </html>
7.3分支指令
v-if 分支指令单分支 v-if="条件"双分支 v-if="条件" v-else多分支 v-if="表达式返回bol值" v-else-if="表达式返回bol值" v-elsev-show 显示/隐藏指令控制样式的显示/隐藏
<!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>title</title> </head> <body><div id="myapp">普通页面<div v-if="isVip"><img src="./imgs/a.png"><br>微信:xxxxx</div><div v-show="isVip"><img src="./imgs/a.png"><br>微信:xxxxx</div><!-- <div v-if="isVip"><img src="./imgs/a.png"><br>微信:xxxxx</div><div v-else>充值之后有惊喜</div> --><!-- <div v-if="vipGrade==1">普通VIP的奖励</div><div v-else-if="vipGrade==2">高级VIP的奖励</div><div v-else-if="vipGrade==3">帝王VIP的奖励</div><div v-else-if="vipGrade==4">宇宙VIP的奖励</div><div v-else>穷b充值去...</div> --></div> </body> <script type="module">import { createApp,ref } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'/*v-if 分支指令单分支 v-if="条件"双分支 v-if="条件" v-else多分支 v-if="表达式返回bol值" v-else-if="表达式返回bol值" v-elsev-show 显示/隐藏指令控制样式的显示/隐藏*/createApp({setup(){//使用 变量 函数let isVip = ref(false)let vipGrade = ref(0)//return {//如果变量 函数 需要在页面中使用,则需要返回 对外暴漏isVip,vipGrade}}}).mount('#myapp')</script> </html>
7.4事件指令
//全局函数不能正常触发 //1.函数需要写在setup函数中 才能正常触发//2.onclick 变成 v-on:click//3. v-on:click="myTest" myText函数的()可以省略//4. 通过函数 改变数据时 数据必须是相应式数据 ref reactive// ref对象.value reactive对象.属性名//5. 如果封装的公共函数 再div中没有调用 不需要对外暴漏//6. v-on:事件 简写为 @事件
<!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>title</title> </head> <body><div id="myapp"><h1>{{title}}</h1><input type="text" :value="msg.name" /><button @click="myTest">点我</button></div> </body> <script type="module">//全局函数不能正常触发 //1.函数需要写在setup函数中 才能正常触发//2.onclick 变成 v-on:click//3. v-on:click="myTest" myText函数的()可以省略//4. 通过函数 改变数据时 数据必须是相应式数据 ref reactive// ref对象.value reactive对象.属性名//5. 如果封装的公共函数 再div中没有调用 不需要对外暴漏//6. v-on:事件 简写为 @事件import { createApp,ref,reactive } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'createApp({setup(){//使用 变量 函数const title = ref('hello world!!!!')const msg = reactive({name:'张三'})const myTest = () => {console.log('点击了')title.value = "你好世界!!!"msg.name = "李四"getRes(1,3)}const getRes=(a,b)=>{console.log(a+b);}return {//如果变量 函数 需要在页面中使用,则需要返回 对外暴漏myTest,title,msg}}}).mount('#myapp')</script> </html>
7.5双向绑定
//属性绑定 单向绑定//model(数据) ------> view(视图 dom元素)//表单元素 双向绑定 v-model//model(数据) <------> view(视图 dom元素)//双向绑定之后 需要操作和读取数据时 直接使用变量即可
注意:表单元素不同 双向绑定用法稍有不同
1输入框类 v-model 替代 value属性
<!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>title</title> </head> <body><div id="myapp"><input type="text" v-model="textVal"><button @click="setTextVal">改文本框的值</button><button @click="getTextVal">读文本框的值</button></div> </body> <script type="module">import { createApp,ref } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'createApp({setup(){//使用 变量 函数const textVal = ref('jack')const setTextVal = ()=>{textVal.value = 'rose'}const getTextVal = ()=>{console.log(textVal.value);}return {//如果变量 函数 需要在页面中使用,则需要返回 对外暴漏textVal}}}).mount('#myapp')</script> </html>
2选择类单选框 v-model用来分组 绑定选中的值<input type="radio" v-model="gender" value="1">男//变量可以控制默认值 如果空值 谁都不选const gender = ref('2')多选框v-model用来分组 绑定选中的值<input type="checkbox" v-model="hobby" :value="1">吃饭//数组变量可以控制默认值 如果空集合 谁都不选const hobby = ref([2])
<!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>title</title> </head> <body><div id="myapp"><hr>性别:<input type="radio" v-model="gender" value="1">男<input type="radio" v-model="gender" value="2">女<br>{{gender}}<hr>爱好: <input type="checkbox" v-model="hobby" :value="1">吃饭<input type="checkbox" v-model="hobby" :value="2">睡觉<input type="checkbox" v-model="hobby" :value="3">打豆豆<!-- :value 用来控制表单元素的属性类型value = "1" 类型字符串:value = "1" 类型数字:value = "'1'" 类型字符串-->{{hobby}}<hr></div> </body> <script type="module">import { createApp,ref } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'createApp({setup(){//使用 变量 函数const gender = ref('2')const hobby = ref([2])return {//如果变量 函数 需要在页面中使用,则需要返回 对外暴漏gender,hobby}}}).mount('#myapp')</script> </html>
注意:小技巧
<input type="checkbox" v-model="hobby" :value="1"> <!-- 表单元素上:value 用来控制表单元素的属性类型value = "1" 类型字符串:value = "1" 类型数字:value = "'1'" 类型字符串-->
3下拉列表v-model绑定在select标签上<select v-model="city">值可以控制 option被默认选中当option改变时 绑定的值city也会改变
<!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>title</title> </head> <body><div id="myapp"><!-- select 选项 option上 都需要配置value值 --><select v-model="city"><option value="">-------请选择--------</option><option value="1">北京</option><option value="2">上海</option><option value="3">深圳</option></select>{{city}}</div> </body> <script type="module">import { createApp,ref } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'createApp({setup(){//使用 变量 函数const city = ref("")return {//如果变量 函数 需要在页面中使用,则需要返回 对外暴漏city}}}).mount('#myapp')</script> </html>
7.6v-for遍历标签
需要遍历生成元素时
1.有列表数据2.在需要遍历生成的元素上添加 v-for 指令 会带着子标签一起遍历3. v-for="临时变量 in 集合"通过模板语法 使用临时变量 显示集合中的内容4.配合使用的模板语法 {{city.name}}文本 :value="city.code" 属性
简化的v-for语法v-for="临时变量 in 集合"完整语法v-for="(临时变量,索引) in 集合"为了防止数据重复渲染异常 建议搭配:key属性<option v-for="(city,index) in cityList" :key="index" :value="city.code">{{index}} {{city.name}}</option>
<!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>title</title> </head> <body><div id="myapp"><ul><li v-for="msg in msgList">{{msg.content}}</li></ul><hr><table border="1"><thead><tr><th>编号</th><th>名称</th><th>年龄</th></tr></thead><tbody><tr v-for="student in stuList"><td>{{student.id}}</td><td>{{student.name}}</td><td>{{student.age}}</td></tr></tbody></table><hr><select v-model="cityCode"><option v-for="(city,index) in cityList" :key="index" :value="city.code">{{index}} {{city.name}}</option></select>{{cityCode}}</div> </body> <script type="module">import { createApp,ref } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'createApp({setup(){/*1.有列表数据2.在需要遍历生成的元素上添加 v-for 指令 会带着子标签一起遍历3. v-for="临时变量 in 集合"通过模板语法 使用临时变量 显示集合中的内容4.配合使用的模板语法 {{city.name}}文本 :value="city.code" 属性简化的v-for语法v-for="临时变量 in 集合"完整语法v-for="(临时变量,索引) in 集合"为了防止数据重复渲染异常 建议搭配:key属性<option v-for="(city,index) in cityList" :key="index" :value="city.code">{{index}} {{city.name}}</option>*///使用 变量 函数const msgList = [{content:'中国航天 生日快乐'},{content:'蜜雪冰城小票藏连载小说热'},{content:'用风神L8打开书本里的世界商'}]const stuList = [{id:1,name:"lisi",age:18},{id:2,name:"wangwu",age:20}]const cityList = [{code:"001",name:"北京"},{code:"002",name:"上海"},{code:"003",name:"广州"}]const cityCode = ref('')return {//如果变量 函数 需要在页面中使用,则需要返回 对外暴漏msgList,stuList,cityList,cityCode}}}).mount('#myapp')</script> </html>
8vue生命周期
生命周期钩子
当执行到指定时机时 可以运行自定义代码
其中最常使用的钩子 onMounted
表示页面加载结束 通常用这个时机 加载后端数据
<!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>title</title> </head> <body><div id="myapp">{{msg}}</div> </body> <script type="module">import { createApp,onBeforeMount,onMounted } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'createApp({setup(){//使用 变量 函数let msg = "hello world"/*onMounted 这个时机页面加载完成通常用这个时机获取后端数据 在页面使用*/// onMounted(()=>{ // console.log("Mountd周期执行了");// })// onBeforeMount(()=>{// console.log("onBeforeMount周期执行了");// })// console.log("setup周期执行了");return {//如果变量 函数 需要在页面中使用,则需要返回 对外暴漏msg}}}).mount('#myapp')</script> </html>