• Vue - 快速入门,这一套就够了!(Vue core + 案例 + 效果演示)


    目录

    前言

    一、Vue 基础

    1.1、Vue 基础示例

    a)html 部分:

    b)script 部分:

    二、本地应用

    1.1、内容绑定,事件绑定

    1.1.1、v-text 设置标签文本值

    1.1.2、v-html 设置标签的 innerHTML

    1.1.3、v-on 为元素绑定事件

    a)基本用法

    b)事件修饰符(不常用)

    c)按键修饰符

    1.1.4、 computed 计算属性

    1.1.5、案例:实现一个计数器

    1.2、显示切换,属性绑定

    1.2.1、v-show 元素的显示和隐藏

    1.2.2、v-if切换显示和隐藏(本质和 v-show 不同)

    1.2.3、v-bind 设置元素属性

    1.2.4、案例:实现切换图片

    1.3、列表循环,表单元素绑定

    1.3.1、v-for 生成列表结构

    1.3.2、v-model 双向绑定

    1.3.3、案例:表白墙


    前言


    前置条件:掌握 HTML、CSS、JavaScript、AJAX.

    工具:VsCode.

    插件:Live Server(浏览器实时预览)

    开发版本 Vue.js 如下:

        <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>

    axios.min.js 如下:

    <script src="https://unpkg.com/axios/dist/axios.min.js">script>
    

    Ps:建议都提前下载下来,没网的时候也能用.

    一、Vue 基础


    1.1、Vue 基础示例

    如下代码:

    1. <body>
    2. <div id="app">
    3. {{ message }}
    4. div>
    5. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    6. <script>
    7. var app = new Vue({
    8. el: "#app",
    9. data: {
    10. message: "hello Vue!"
    11. }
    12. });
    13. script>
    14. body>

    效果如下:

    a)html 部分:

    • {{ }}:插值表达式,通过他就可以直接把 data 中的数据引入.

    b)script 部分:

    这里需要先创建一个 Vue 对象,构造的写法格式类似于 ajax.

    • el(挂载点):类似于 js 中的选择器(也可以选择其他属性,但是建议 ID 选择器). Vue 实例会管理 el 选项 命中的元素 及内部的 后代元素. 值得注意的一点是, el 只可以命中除了 和 以外的所有双标签.
    • data(数据对象):Vue 中用到的数据都定义在 data 中,可以写复杂类型,例如 数组、对象,并且遵守 js 语法.

    data 代码示例如下:

    1. <body>
    2. <div id="container">
    3. <h1>{{ title }}h1>
    4. <span>{{ desc.username }}span>
    5. <span>{{ desc.password }}span>
    6. <div>
    7. <li>{{ arr[0] }}li>
    8. <li>{{arr[1]}}li>
    9. <li>{{arr[2]}}li>
    10. div>
    11. div>
    12. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    13. <script>
    14. var app = new Vue({
    15. el: "#container",
    16. data: {
    17. title: "登录",
    18. desc: {
    19. username: "账号:cyk",
    20. password: "密码:111"
    21. },
    22. arr: ["性别", "年龄", "学号"]
    23. }
    24. });
    25. script>

    效果如下:

    二、本地应用


    1.1、内容绑定,事件绑定

    1.1.1、v-text 设置标签文本值

    v-text 可以将 data 中的数据通过 {{}} 插值表达式 设置到 html 标签的内容中,并且默认是替换标签内的全部内容. 

    另外, v-text 中也支持写表达式,例如通过 "+" 进行字符串或 data 的拼接.

    示例如下:

    1. <div id="app">
    2. <h1 v-text="message">h1>
    3. <h1 v-text="message+'!'">h1>
    4. <h1>{{message + "~"}}h1>
    5. <h1 v-text="message + info">h1>
    6. div>
    7. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    8. <script>
    9. var app = new Vue({
    10. el: "#app",
    11. data: {
    12. message: "你好",
    13. info: ", 最近好么?"
    14. }
    15. });
    16. script>

    效果如下:

    1.1.2、v-html 设置标签的 innerHTML

    v-html 指令可以将内容中的 html 解析成标签,而 v-text 只能解析成文本.

    示例如下:

    1. <div id="app">
    2. <h2 v-html="message">h2>
    3. <h2 v-text="message">h2>
    4. div>
    5. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    6. <script>
    7. let app = new Vue({
    8. el: "#app",
    9. data: {
    10. message: '百度'
    11. }
    12. });
    13. script>

    效果如下:

    1.1.3、v-on 为元素绑定事件

    a)基本用法

    v-on 指令就是为元素绑定事件的,也可以将 v-on 简写为 @.  绑定的方法定义在 methods 属性中,方法内部必须通过 this 关键字访问到定义在 data 中的数据.

    常用绑定如下:

    • v-on:click="方法":点击事件.
    • v-on:dblclick="方法":双击事件.
    • v-on:monseenter="方法":鼠标移入事件.

    也可以简写为:

    • @click="方法":点击事件
    • @dblclick="方法":双击事件.
    • @monseenter="方法":鼠标移入事件.

    Ps:这里的方法也可以自定义参数.

    示例如下:

    1. <div id="app">
    2. <input type="button" value="v-on指令" v-on:click="study">
    3. <input type="button" value="v-on简写" @click="study">
    4. <input type="button" value="双击事件" @dblclick="changeFood">
    5. <h1 v-text="food">h1>
    6. div>
    7. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    8. <script>
    9. let app = new Vue({
    10. el: "#app",
    11. data: {
    12. food: "鸡蛋炒米饭"
    13. },
    14. methods: {
    15. study: function () {
    16. alert("学习 Java!");
    17. },
    18. // 此处也可以把 function 省略
    19. changeFood() {
    20. this.food += "超级好吃!"
    21. }
    22. }
    23. });
    24. script>

    效果如下:

    a)点击 v-on指令 按钮(v-on简写效果一样)

    b)双击两次 双击事件 按钮

    b)事件修饰符(不常用)

    语法如下:

    1. @事件名事件修饰符="事件处理函数"
    2. 例如:@click.stop="test"

    主要有以下修饰符:

    • .stop(比较常用):用来阻止事件继续向外传递. 

    例如 div1 有一个子 div2,如果两个 div 都设置了 @click 点击事件,那么当用户点击 子div2 ,会先执行 div2 在向外传递,执行 div1 的点击事件.  如果给子div2 设置了此修饰符,再点击 子div2 时,那么执行完 div2 时,就结束了.

    • .prevent:用来阻止标签的默认行为.

    例如有一个 a 标签,href 指向某一个地址,点击后会进行跳转.  那么此时给他设置点击事件,他会先执行点击事件,再进行跳转,此时如果只想执行点击事件,不进行跳转,就可以使用此修饰符.

    • .self:只监听自身标签触发的事件.

    例如 div1 有一个子 div2,如果两个 div 都设置了 @click 点击事件,那么当用户点击 子div2 ,会先执行 div2 在向外传递,执行 div1 的点击事件.  如果给 子div1 设置了此修饰符,再点击 div2 ,那么执行完 div2 时,就结束了.

    • .once:该事件只触发一次.

    例如有一个 div 标签,设置了 @click 点击事件,那么只有第一次点击才触发事件,之后再点击就不会触发了.

    c)按键修饰符

    用来对键盘按键事件进行修饰,例如 keyup(按下键盘立即触发),keydown(抬起键盘立即触发).

    语法如下:

    1. @按键事件按键修饰符="事件处理函数"
    2. 例如:@keyup.enter="test"

    主要有以下修饰符:

    • .enter:对键盘回车键修饰.
    • .tab:对键盘切换 tab 按键修饰.
    • .delete:捕获 "删除" 和 "退格" 键.
    • .esc:对键盘的 esc 按键修饰.
    • .space:捕获空格按键.
    • .up:上.
    • .down:下.
    • .left:左.
    • .right:右.

    Ps:这里也可以进行链式调用,比如 @keyup.enter.tab.esc ,就是同时对这三个键进行捕获,捕获到任意一个都会触发 事件处理函数.

    示例如下:

    1. <body>
    2. <div id="app">
    3. <input type="button" value="按我有惊喜~" @click="doIt('java', 666)">
    4. <input type="text" @keyup.enter="doEnter">
    5. div>
    6. <script src=" https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    7. <script>
    8. let app = new Vue({
    9. el: "#app",
    10. methods: {
    11. doIt: function (p1, p2) {
    12. alert("学习" + p1 + "真是" + p2 + " (如同 49 年入国军)");
    13. },
    14. doEnter: function () {
    15. alert("按下了回车");
    16. }
    17. }
    18. });
    19. script>
    20. body>

    效果如下:

    a)点击按我有惊喜

    b)选中输入框内,按 enter 键

    1.1.4、 computed 计算属性

    作用:在 Vue 实例中完成计算任务.

    好处:提升 Vue 运算性能,因为他会将第一次计算的结果进行缓存,便于日后多次调用.

    潜台词:只要涉及到计算的地方,用它就够了.

    示例如下:

    1. <body>
    2. <div id="app">
    3. <div>{{ mTest() }}div>
    4. <div>{{ mTest() }}div>
    5. <div>{{ mTest() }}div>
    6. <div>{{ cTest }}div>
    7. <div>{{ cTest }}div>
    8. <div>{{ cTest }}div>
    9. div>
    10. <script src="../js/vue.js">script>
    11. <script>
    12. let app = new Vue({
    13. el: "#app",
    14. data: {
    15. result: 0
    16. },
    17. methods: {
    18. mTest() {
    19. console.log("执行了 methods!");
    20. return 1;
    21. }
    22. },
    23. computed: {
    24. //虽然是计算属性,但是这里要写成方法的形式
    25. cTest() {
    26. console.log("执行了 computed")
    27. return 2;
    28. }
    29. }
    30. });
    31. script>
    32. body>

    效果如下: 

    1.1.5、案例:实现一个计数器

    需求:

    1. 点击 加1 按钮,计数器 +1;
    2. 点击 减1 按钮,计数器 -1. 
    3. 计数器上限为 10,下限为 0.

    代码如下:

    1. <body>
    2. <div id="app">
    3. <h1 v-text="num">h1>
    4. <input type="button" value="减1" @click="sub">
    5. <input type="button" value="加1" @click="add">
    6. <div>
    7. <input type="button" value="双击归零" @dblclick="ret">
    8. div>
    9. div>
    10. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    11. <script>
    12. let app = new Vue({
    13. el: "#app",
    14. data: {
    15. num: 0
    16. },
    17. methods: {
    18. sub: function () {
    19. if (this.num > 0) {
    20. this.num--;
    21. } else {
    22. alert("当前以及是最小值了!");
    23. return;
    24. }
    25. },
    26. add: function () {
    27. if (this.num < 10) {
    28. this.num++;
    29. } else {
    30. alert("当前以及是最大值了!");
    31. return;
    32. }
    33. },
    34. ret: function () {
    35. this.num = 0;
    36. }
    37. }
    38. });
    39. script>
    40. body>

    效果如下:

    a)点击一次减1

    b)点击6次加1

    1.2、显示切换,属性绑定

    1.2.1、v-show 元素的显示和隐藏

    v-show 指令可以根据真假(布尔类型)来切换元素的显示状态,本质上是修改元素的 display.

    Ps:数据改变以后,对应元素的显示会同步更新.

    示例如下:

    1. <body>
    2. <div id="app">
    3. <input type="button" value="图标展示开关" v-on:click="show">
    4. <img src="../img/Vue.png" v-show="isShow">
    5. <div>
    6. <input type="button" value="也支持表达式" v-on:click="add">
    7. div>
    8. <img src="../img/Vue.png" v-show="num>2">
    9. div>
    10. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    11. <script>
    12. let app = new Vue({
    13. el: "#app",
    14. data: {
    15. isShow: true,
    16. num: 1
    17. },
    18. methods: {
    19. show: function () {
    20. this.isShow = !this.isShow;
    21. },
    22. add: function () {
    23. this.num++;
    24. }
    25. }
    26. });
    27. script>
    28. body>

    效果如下:

     a)点击图标展示开关

    b)点击两次 也支持表达式 按钮

    1.2.2、v-if切换显示和隐藏(本质和 v-show 不同)

    v-if 的作用就是根据表达式的布尔值切换元素的显示状态,本质就是通过操作 dom 元素状态来切换显示状态(表达式为 true ,元素新增在 Dom 树中;为 false,从 dom 中删除).

    因此建议:如果显示和隐藏的操作十分频繁,建议使用 v-show,反之,使用 v-if.

    示例如下:

    1. <body>
    2. <div id="app">
    3. <input type="button" value="切换显示状态" v-on:click="changeShow">
    4. <h2 v-if="isShow">我是 v-if! 我出来啦!h2>
    5. <h2 v-show="isShow">我是 v-show!我出来啦!h2>
    6. div>
    7. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    8. <script>
    9. let app = new Vue({
    10. el: "#app",
    11. data: {
    12. isShow: false
    13. },
    14. methods: {
    15. changeShow: function () {
    16. this.isShow = !this.isShow;
    17. }
    18. }
    19. });
    20. script>
    21. body>

    效果如下:

    a)点击按钮

    1.2.3、v-bind 设置元素属性

    v-bind 用来为元素绑定属性,例如 src、title、class.

    用法:v-bind:属性名=表达式.

    简写::属性名

    Ps:通过 v-bind 增删属性是动态的.

    示例如下:

    1. <body>
    2. <div id="app">
    3. <img v-bind:src="imgSrc" width="100px" height="100px">
    4. <br>
    5. <img :src="imgSrc" :class="isShow?'active':''" width="100px" height="100px">
    6. <br>
    7. <img :src="imgSrc" :class="{active: isShow}" width="100px" height="100px" @click="changeShow">
    8. div>
    9. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    10. <script>
    11. let app = new Vue({
    12. el: "#app",
    13. data: {
    14. imgSrc: "../img/Vue.png",
    15. isShow: true,
    16. },
    17. methods: {
    18. changeShow: function () {
    19. this.isShow = !this.isShow;
    20. }
    21. }
    22. })
    23. script>
    24. body>

    效果如下:

    a)点击第三个图标.

    1.2.4、案例:实现切换图片

    需求:

    有三张图片,实现切换图片效果.

    当前为第一张图片时,不显示 <上一张< 按钮,<下一张< 按钮同理.

    示例如下:

    1. <template>
    2. <div id="login">
    3. <div>
    4. <input type="button" value="上一张" @click="prev" v-show="index > 0" />
    5. <img :src="imgSrc[index]" alt="" class="def" />
    6. <input type="button" value="下一张" @click="next" v-show="index < 2" />
    7. div>
    8. div>
    9. template>
    10. <script>
    11. export default {
    12. data() {
    13. return {
    14. imgSrc: [
    15. require("../assets/docker.jpg"),
    16. require("../assets/vmware.png"),
    17. require("../assets/Vue.png"),
    18. ],
    19. index: 0,
    20. };
    21. },
    22. methods: {
    23. prev: function () {
    24. console.log(this.imgSrc[this.index]);
    25. this.index--;
    26. },
    27. next: function () {
    28. this.index++;
    29. },
    30. },
    31. };
    32. script>
    33. <style scoped>
    34. .def {
    35. height: 50px;
    36. width: 100px;
    37. }
    38. style>

    注意:

     以下这种方式引入图片是无效的,因为 Vue 中的打包工具 webpack 是按照字符打包的,不会做任何处理,所以需要 import 外部引入或者 require 内部引入。

    1. export default {
    2. data:{
    3. return {
    4. src:'./assets/image/a.jpg'
    5. }
    6. }
    7. }

     如下:

    1. //外部引入
    2. import a from './assets/image/a.jpg'
    3. export default {
    4. data:{
    5. return {
    6. src:'./assets/image/a.jpg'
    7. }
    8. }
    9. }
    10. //内部引入
    11. export default {
    12. data:{
    13. return {
    14. src:require('./assets/image/a.jpg')
    15. }
    16. }
    17. }

    效果如下:

    a) 第一张图片

    b)第二张图片

    c)第三张图片

    1.3、列表循环,表单元素绑定

    1.3.1、v-for 生成列表结构

    v-for 用来根据数据生成列表结构,经常和数组搭配使用. 

    用法如下(类似于 Java 中的 for(arr : arrs)):

    v-for="(item, index) in 数据名"

    item:自定义的变量名,是 数据名 一条条遍历得到的数据,

    index:数据名的当前遍历的下标.

    数据名:data 中数组的名字.

    注意:在使用 v-for 的时候,官方建议建议提供 v-bind:key="唯一标识" 来为 Vue 提供唯一属性,提高效率

    Ps:数组的长度也是动态更新的.

    示例如下:

    1. <body>
    2. <div id="app">
    3. <h3 v-for="(name,index) in names" :key="name">
    4. {{index + 1}}. 姓名: {{name}}
    5. h3>
    6. <hr>
    7. <input type="button" value="最后再加一份牛肉" @click="add">
    8. <input type="button" value="删除第一道菜" @click="remove">
    9. <h2 v-for="food in foodNames">
    10. {{food.name}}
    11. h2>
    12. div>
    13. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    14. <script>
    15. let app = new Vue({
    16. el: "#app",
    17. data: {
    18. names: ["张三", "李四", "王五", "赵六"],
    19. foodNames: [
    20. { name: "炒饭" },
    21. { name: "炒面" },
    22. { name: "炒鸡蛋" }
    23. ]
    24. },
    25. methods: {
    26. add: function () {
    27. this.foodNames.push({ name: "牛肉" });
    28. },
    29. remove: function () {
    30. this.foodNames.shift();
    31. }
    32. }
    33. });
    34. script>
    35. body>

    效果如下:

    a)点击两次 最后再加一份牛肉 按钮.

    b)点击两次 删除第一道菜 按钮

    1.3.2、v-model 双向绑定

    v-model 可以更便捷的设置和获取表单元素值,并且绑定的数据会和表单元素值相关联(动态双向绑定).

    示例如下:

    1. <body>
    2. <div id="app">
    3. <input type="text" v-model="message" @keyup.enter="show">
    4. <input type="button" value="修改" @click="change">
    5. div>
    6. <script src=" https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    7. <script>
    8. let app = new Vue({
    9. el: "#app",
    10. data: {
    11. message: "php 是世界上最好的语言!"
    12. },
    13. methods: {
    14. show: function () {
    15. alert(this.message);
    16. },
    17. change: function () {
    18. this.message = "java 才是最牛逼的!";
    19. }
    20. }
    21. });
    22. script>
    23. body>

    上述代码中,在浏览器中的 input 框中输入 任何信息都会使Vue 的 data 数据中 message 立即同步.  并且如果修改 data 中 message 的值,也会影响到 浏览器中 input 框中的数据立即更新.

    效果如下:

    a)点击修改按钮

    1.3.3、案例:表白墙

    需求:实现一个表白墙.

    1. 实现在墙上发布表白内容.
    2. 实现清空数据功能.
    3. 统计总数据.
    4. 删除指定表白内容.

    代码如下:

    1. <body>
    2. <div id="app">
    3. <h1>表白墙h1>
    4. <div>
    5. <span>你:span>
    6. <input type="text" v-model="myname">
    7. div>
    8. <div>
    9. <span>对他:span>
    10. <input type="text" v-model="itName">
    11. div>
    12. <div>
    13. <span>说:span>
    14. <input type="text" v-model="msg" @keyup.enter="publish">
    15. div>
    16. <div>
    17. <input type="button" value="发布" @click="publish">
    18. <input type="button" value="清空" @click="clearAll">
    19. <span>共有 {{msgList.length}} 条数据span>
    20. div>
    21. <hr>
    22. <ul>
    23. <li v-for="(message, index) in msgList">
    24. <span>{{ (index + 1) + '. ' + message }}span>
    25. <input type="button" value="删除" @click="del(index)">
    26. li>
    27. ul>
    28. div>
    29. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
    30. <script>
    31. let app = new Vue({
    32. el: "#app",
    33. data: {
    34. myname: "",
    35. itName: "",
    36. msg: "",
    37. msgList: ["lyj 对 cyk 说: 喵~"]
    38. },
    39. methods: {
    40. publish: function () {
    41. let tmpMsg = this.myname + " 对 " + this.itName + " 说: " + this.msg;
    42. this.msgList.push(tmpMsg);
    43. },
    44. del: function (toDelIndex) {
    45. this.msgList.splice(toDelIndex, 1); //从 toDelIndex 下标开始往后删除一个元素
    46. },
    47. clearAll: function () {
    48. this.msgList = [];
    49. }
    50. }
    51. });
    52. script>
    53. body>

    效果如下: 

    a)输入数据后,发布两条数据.

    b)删除第二条数据

  • 相关阅读:
    【JAVA】我们该如何规避代码中可能出现的错误?(三)
    linux权限
    制作rpm包实例
    智慧公厕厂家为城市智慧化建设提供城市卫生升级的力量
    es5的实例__proto__(原型链) prototype(原型对象) {constructor:构造函数}
    Nuxt 3组件开发与管理
    【MM32F5270开发板试用】定制MicroPython及读取MPU6050数据到OLED1306
    单向环形链表构建(思路分析) [Java][数据结构]
    练习15. 窗口函数,RANK、DENSE_RANK、ROW_NUMBER
    HarmonyOS 鸿蒙隔离层设计
  • 原文地址:https://blog.csdn.net/CYK_byte/article/details/133848445