前提

Vue
进度: https://www.bilibili.com/video/BV1Zy4y1K7SH/?p=6&spm_id_from=pageDriver&vd_source=81bee25537470aeb5c65db3a5bba55ac
Vue2文档教程: https://v2.cn.vuejs.org/v2/guide/
https://v2.cn.vuejs.org/v2/guide/index.html
导入:
new Vue
| |
| |
| <div id="root"> |
| <h1>{{new Date()}}</h1> |
| <h1>{{name}}</h1> |
| |
| <p><a :href="url" target="_blank">我的博客</a></p> |
| </div> |
| <script> |
| |
| Vue.config.productionTip = false; |
| |
| new Vue({ |
| el: "#root", |
| data: { |
| name: "Hello Vue", |
| url: "https://www.yujing.fit" |
| } |
| }) |
| </script> |
数据绑定
| <div id="app"> |
| <p>单向数据绑定:<input type="text" :value="text"></p> |
| |
| |
| <p>双向数据绑定:<input type="text" v-model="text"></p> |
| </div> |
| |
| <script> |
| new Vue({ |
| el: "#app", |
| data:{ |
| text: "Tiam" |
| } |
| }) |
| </script> |
挂载方式
| <div id="app"> |
| {{text}} |
| </div> |
| <script> |
| const vm = new Vue({ |
| |
| data() { |
| return { |
| text: "Tiam" |
| } |
| } |
| }) |
| |
| vm.$mount("#app"); |
| console.log(vm); |
| |
| let number = 18; |
| let person = { |
| name: "luo", |
| } |
| Object.defineProperty(person, 'age', { |
| |
| |
| |
| |
| |
| |
| get() { |
| return number; |
| }, |
| |
| set(value) { |
| console.log("被修改了为" + value); |
| number = value; |
| } |
| }) |
| console.log(person); |
| |
数据代理 | 数据劫持
| <div id="app"> |
| <div>{{name}}</div> |
| |
| <button v-on:click="change">求求你,点点我</button> |
| <button @click="method1('参数1',$event)">调用 method1 </button> |
| </div> |
| <script> |
| Vue.config.productionTip = false; |
| |
| let data = { |
| name: "湖北师范大学", |
| address: "黄石港区" |
| } |
| const vm = new Vue({ |
| el: '#app', |
| |
| data, |
| methods: { |
| change(event) { |
| console.log(event); |
| |
| console.log(event.target.innerText); |
| console.log(data); |
| |
| console.log(this); |
| this.name = this.address; |
| }, |
| |
| method1: (param, event) => { |
| |
| console.log(this); |
| console.log(param); |
| console.log(event); |
| } |
| } |
| }) |
| |
| console.log(vm._data === data); |
| |
| </script> |
事件修饰符
| <div id="app"> |
| <h2>Vue中的6个事件修饰符(常见前3个)</h2> |
| <ul> |
| <li>1. prevent 阻止默认事件</li> |
| <li>2. stop 阻止事件冒泡 , 从子元素到父元素冒泡</li> |
| <li>3. once 事件只触发一次</li> |
| <li>4. capture 使用事件的捕获模式 , 捕获(事件)行为从父元素到子元素</li> |
| <li>5. self 只有event.target是当前操作的元素才出发事件 , 即点击 其子元素不会触发</li> |
| <li>6. passive 事件的默认行为立即执行, 无需等待时间回调执行完毕, 就是刚调用的函数还没执行完, 又被触发了, 就会等待函数执行完, 卡住调用的行为. |
| 使用passive后就不会等待函数执行完, 执行调用行为</li> |
| </ul> |
| <p>修饰符可链式调用eg: @click.prevent.stop.once 添加多个事件</p> |
| <a href="https://yujing.fit" @click.prevent="jumpToMyBlog">俺的博客儿</a> |
| |
| 两个滚动条事件 |
| @scroll |
| @wheel |
| </div> |
| <script> |
| new Vue({ |
| el: '#app', |
| data: { |
| |
| }, |
| methods: { |
| jumpToMyBlog(e){ |
| alert("欢迎!"); |
| |
| |
| } |
| }, |
| }) |
| </script> |
键盘事件
| <div id="app"> |
| <h1>键盘事件</h1> |
| <h2>@keydown: 键盘被按下后触发</h2> |
| <h2>@keyup: 键盘被按下后不触发, 松开后触发(一般常用这个)</h2> |
| <h2>您刚刚输入了:{{info}} </h2> |
| |
| <input type="text" @keyup.ctrl.enter="showInfo" placeholder="输入后 按下Ctrl+回车后打印信息"> |
| |
| <h2>您按下了: {{key}}, 其键盘码(ASCII码)为{{code}} </h2> |
| <input type="text" @keydown="showkey" placeholder="打印你按下的键盘"> |
| |
| |
| <h3>常用按键别名</h3> |
| <ol> |
| <ul>回车 => enter</ul> |
| <ul>删除(包括Back和Delete两个键) => delete</ul> |
| <ul>退出 => esc</ul> |
| <ul>空格 => space</ul> |
| <ul>换行 => tab (适合使用keydown, 否则会失效)</ul> |
| <ul>上 => up</ul> |
| <ul>下 => down</ul> |
| <ul>左 => left</ul> |
| <ul>右 => right</ul> |
| </ol> |
| </div> |
| <script> |
| new Vue({ |
| el: '#app', |
| data: { |
| info: "", |
| key: "", |
| code: "" |
| }, |
| methods: { |
| showInfo: function (e) { |
| |
| |
| console.log(e.target.value); |
| this.info = e.target.value; |
| }, |
| showkey(e) { |
| |
| console.log("您输入了" + e.key, e.keyCode); |
| this.key = e.key; |
| this.code = e.keyCode; |
| } |
| } |
| |
| }) |
| </script> |
计算属性computed
| <div id="app"> |
| <label for="na">姓: <input id="na" type="text" v-model="na"></label><br> |
| <label for="me">名: <input id="me" type="text" v-model="me"></label><br> |
| <span>姓名:【{{na}}-{{me}}】 </span><br> |
| <span>插值语法 调用函数 返回值(效率不高): 【{{fullName()}} 】,每次使用都会调用,【{{fullName()}}】</span><br> |
| <span>使用计算属性computed读取的: 【{{fillName}} 】第一次读取后会做缓存,下次使用不再调用 【{{fillName}}】 </span><br> |
| <span>简写 {{fillName1}} </span> |
| </div> |
| <script> |
| const vm = new Vue({ |
| el: '#app', |
| data: { |
| na: "陈", |
| me: "思宇", |
| }, |
| methods: { |
| fullName() { |
| console.log("methods被调用"); |
| return this.na + '-' + this.me; |
| } |
| }, |
| |
| computed: { |
| fillName: { |
| |
| get() { |
| console.log("computed被调用"); |
| return this.na + '-' + this.me; |
| }, |
| |
| set(value) { |
| |
| |
| |
| } |
| }, |
| |
| fillName1() { |
| return this.na + this.me; |
| } |
| |
| } |
| }) |
| </script> |
监听属性watch
| <div id="app"> |
| <h1>小明:"你是真{{info}} ", {{count}} </h1> |
| |
| <button @click="sayReal">说真话1</button> |
| |
| <button @click="isReal=!isReal;count++">说真话2</button> |
| </div> |
| <script> |
| const vm = new Vue({ |
| el: '#app', |
| data: { |
| isReal: false, |
| count: 0, |
| }, |
| methods: { |
| sayReal() { |
| this.isReal = !this.isReal; |
| } |
| }, |
| computed: { |
| info() { |
| return this.isReal ? "笨比" : "好看"; |
| } |
| }, |
| |
| watch: { |
| |
| isReal: { |
| |
| immediate: true, |
| handler(newValue,oldValue){ |
| console.log(oldValue+"被改为了"+newValue); |
| |
| } |
| } |
| |
| } |
| }) |
| |
| |
| vm.$watch('isReal',{ |
| |
| handler(){ |
| |
| } |
| }) |
| </script> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程