week10_day05_Vue基础1

1Vue
1.1Vue的定义
Vue.js------ 渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合(非常容易导入第三方轮子)。另一方面,Vue 完全有能力驱动采用单文件组件和Vue生态系统支持开发复杂单页应用。

渐进式:从核心到完备的全家桶(需要什么引用什么)
可以用一个,可以用多个,如我们想让前端传一个对象到后台,就 可以用Vue中axios这个东西,这种东西就是第三方插件,或者用 Java中的话说叫轮子。
Vue本身语法内容并不多, 生态是很庞大的(如ssm这些都是java中间件,都属于java生态的内容),也就是说除了Vue语法之外,还有很多和Vue相关联的,在它基础之上的,提供各种功能的一些东西。

增量:从少到多,从一页到多页,从简单到复杂
写前端基本上就是一套网站,可能是由多个页面组成。Vue就可以让我们写一页也能供用户浏览,写多页也能供用户浏览,也就是可以不停的往已有的项目中添加东西。

只关注视图层
Vue让你只关注显示相关的。但其实我们需要关注底层的东西。这些是无法替代的东西,老了以后可以靠这些吃饭。

单文件组件: 一个文件描述一个组件
单页应用: 经过打包生成一个单页的html文件和一些js文件

为什么要讲vue? 项目前端都是Vue, 国内前端框架市场基本上70%以上都是使用vue这个框架
或者, 不是用框架写的前端 ( 旧的项目jsp 模板技术 )

框架: 工程化的角度 如之前学的DBUtils
所谓框架, 就是在工程化实现一个东西的时候, 构建的大的轮廓, 和提供一些基础性的设施
后来者,或者使用者, 可以在这个框架的基础上, 迅速的把要实现的目标实体快速构建出来

vue基本语法(简单)
简洁,轻量,快速,数据驱动,模块友好,组件化
现在的前端是组件化的天下

1.2Vue课程
分为两部分
1, 先讲vue基本语法
2, 怎么创建项目- 在vue中开发页面-- 打包项目-- 怎么部署
我们平时写的简单的java语句,是从main函数启动的,但你想,淘宝也是从main启动的么?一定不是,main函数启动运行结束之后,程序运行结束。程序挂掉了,还有对象吗?
没了。对象里面有方法,有数据,对象对我们来说是有意义的,所以必须要求对象是存活的。
如何保证对象存活?
把代码整理,打包后,实际上就是对java代码、class文件进行汇总,类似于一个压缩包一样,把这个打包后的文件放到某个地方,让某个东西帮你来运行出对象,让对象保证存活。别人就可以去访问,根据存活的对象去处理一些逻辑。这个过程叫部署。
Java需要这样做,前端其实也需要这样,以保证外部对其能正确的访问。

为了便于理解,我们首先会在html页面把vue基本语法讲清楚, 先借助html页面来实现vue
但这样是有问题的,毕竟html并不是一个专门用来写Vue的东西

Vue的标准写法是在.vue文件中来实现

1.3一个Vue页面用html
在vue官网中,点击学习—>教程---->找到代码:

输入网址:https://cdn.jsdelivr.net/npm/vue@2.6.11

将其中的内容复制到vue.js文件中,以后访问就不用访问这个网址了,直接访问本机中的vue.js文件即可。
或者直接下载生产版本,生产版本较比于开发版本较为稳定。

<!-- 一个div 他的id 是root -->
<!-- 在vue中 {{}}: 叫插值表达式 ,
这个插值表达式之中是一个js式子,
这个式子的对应参数要去对应关联的vue对象中去取 -->
<!--注:尽量不要用class属性,避免出现哪些不必要的bug-->
<div id="root">
    {{msg}}
    {{msg + aaa}}
</div>

<script>
    // new了一个vue对象
    // 这个vue对象通过,对象的el属性, 与el属性所指向的id所对应的html代码关联起来
    // 把对象和对应html域关联起来
    // data标识vue对象的数据存储属性(除了vue对象固有的属性, 别的属性一般存在data里)
    new Vue({
        el: '#root',
        data: {
            msg: 123,
            aaa: 2000
        }
    })
</script>

1.4V指令
V-bind
V-model
V-text
V-html
V-show
V-if
V-else
V-else-if
V-for
V-on
V-pre
V-cloak
v-once

1.5V-bind: 单向绑定
把vue对象中data里的值,绑定到html对应是属性上去, 赋值给对应的属性

1.5.1V-model: 双向绑定
v-model:
实现双向数据绑定
<!–v-model: 双向绑定, 改变或者绑定,是个双向的
1, 和v-bind作用相同, 去对应的vue对象里的data取值, 把取到的值赋值给所绑定的对象
2, v-model绑定的参数, 当这个参数(在html中)发生改变的时候, 他会同时去修改对应vue对象中data里面所对应的值
注意: 双向绑定v-model: 一般用于表单元素的value属性
所以有时候可以省略的写 v-model="***"

1.5.2V-text v-html
类似于dom操作中的 innerText innerHTML

1.5.3V-on: 事件监听
v-on:标识vue语法的事件监听
把监听到的事件, 触发到 对应vue对象的methods里面去

vue中没有onclick

注意1: 在vue中, 如果要在方法或者别的钩子函数里, 要访问data里的值,
要通过 this.参数名 来访问
这个this 就是指代这个vue对象

1.5.4V-show
隐藏和显示,类似于加了一个css样式

注意2: 在v-show的判断条件里, 可以写表达式
在这里插入图片描述

1.5.5V-if
v-else-if v-else

v-if和v-show的区别: v-if逻辑中,如果不满足加载条件, 那么该元素不会挂载到dom树上去. 但是v-show 无论显示与否, 都会挂载到dom树上,是不过会显示和不显示

08_v-if.html运行后dom树中的内容:
在这里插入图片描述
07_v-show运行后dom树中的内容:第一个div挂在dom树上,只不过显示为dispaly:none
在这里插入图片描述

1.5.6V-for
在vu中对应的html代码中创建一个循环结构

注意1: 循环渲染的,到底是什么?
循环渲染的, 是v-for这个指令所在的html元素(在这段代码里表现的就是一个个的div)

注意2: v-for指令必须要和 :key配套出现
并且key值唯一, 不可重复,v-for会根据key做渲染
(aaa, index) in list"
index代之循环遍历的下标

注意3: v-for 这个循环, 可以用 of/in 两种形式来循环

1.5.7V-pre
v-pre可以用来阻止预编译,有v-pre指令的标签内部的内容不会被编译,会原样输出。
在这里插入图片描述

1.5.8v-cloak
讲这个知识点之前先了解一下,哪些网站是用Vue写的?
Bilibili、掘金

延迟显示。
这个指令保持在元素上直到关联实例结束编译。和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 标签直到实例准备完毕

1.5.9V-once
只加载一次(只编译一次)

1.5.10回顾
v-bind: 单向绑定, 可以去vue对象的data里面取参数, 绑定到对应的属性上
v-model: 双向绑定 , 可以取值从Vue对象, 并且改变的话也会影响到vue对象中的值
相互关联, 相互影响
v-text: 向标签内部插入一个字符串
v-html: 向标签内部插入一个可以是字符串,也可以是携带html标签的代码段
v-on: 事件监听, 可以缩写成 @ , 监听一个方法触发到vue对象的methods里面
v-show: 隐藏和显示, 一定会挂载到dom树上
v-if 也可以做隐藏和显示(分支结构) 不一定, 满足挂载, 不满足不挂载

v-for: 循环渲染, 循环显示, 数组, for循环出来的是其所在标签
一定要有个 :key=’唯一值’
In/of
v-pre: 阻止预编译
v-cloak: 延迟加载
v-once: 只加载一次

关于v-text:、v-html,它其实相当于DOM操作中的innertext、innerhtml,即把结点中的文字域进行修改,而这段代码,就表示把外面div中的所有数据改成’aaaa’,所以运行后浏览器中显示的就是aaaa。

<div v-text="aaaa">
	<div v-html="bbb">
	</div>
</div>

作业
1, 注册页面, ----dom操作-- vue操作(dom操作不要)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Homework1</title>
    <script src="../vue.js"></script>
</head>
<body>

<div id="root">
    <table cellspacing="10">
        <tr>
            <td>注册邮箱:</td>
            <td><input></td>
        </tr>
        <tr>
            <td></td>
            <td>你还可以使用手机号注册</td>
        </tr>
        <tr>
            <td>创建密码:</td>
            <td><input></td>
        </tr>
        <tr>
            <td>真实姓名:</td>
            <td><input></td>
        </tr>
        <tr>
            <td align="right">性别:</td>
            <td>
                <input type="radio" value="1" name="aaa"><input type="radio" value="2" name="aaa"></td>
        </tr>
        <tr>
            <td align="right">生日:</td>
            <td>
                <select>
                    <option>2000</option>
                    <option>2001</option>
                    <option>2002</option>
                </select><select>
                    <option>1</option>
                    <option>2</option>
                    <option>3</option>
                    <option>4</option>
                    <option>5</option>
                    <option>6</option>
                    <option>7</option>
                    <option>8</option>
                    <option>9</option>
                    <option>10</option>
                    <option>11</option>
                    <option>12</option>
                </select><select>
                    <option>1</option>
                    <option>2</option>
                    <option>3</option>
                    <option>4</option>
                    <option>5</option>
                    <option>6</option>
                    <option>7</option>
                    <option>8</option>
                    <option>9</option>
                    <option>10</option>
                    <option>11</option>
                    <option>13</option>
                    <option>14</option>
                    <option>15</option>
                    <option>16</option>
                    <option>17</option>
                    <option>18</option>
                    <option>19</option>
                    <option>20</option>
                    <option>21</option>
                    <option>22</option>
                    <option>23</option>
                    <option>24</option>
                    <option>25</option>
                    <option>26</option>
                    <option>27</option>
                    <option>28</option>
                    <option>29</option>
                    <option>30</option>
                </select></td>
        </tr>
        <tr>
            <td align="right">我正在:</td>
            <td>
                <select>
                    <option>学习</option>
                    <option>打球</option>
                    <option>跑步</option>
                </select>
            </td>
        </tr>
        <tr>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td>
                <!--changeImg方法不传参数就去掉括号-->
                <img id="img1" :src="url"><span @click="changeImg">看不清.换一张?</span>
            </td>
        </tr>
        <tr>
            <td align="right">验证码:</td>
            <td><input id="inputStr" v-model="inputStr"></td>
        </tr>
        <tr>
            <td></td>
            <td>
                <img id='img2' src="btn_reg.gif" @click="onclick1">
            </td>
        </tr>
    </table>
</div>

<script>
    new Vue({
        el: '#root',
        data: {
            //js有二维数组,但不常用。在前端对数据的操作不要过于复杂
            //得有比较字符串,比较输入的和图片对应的字符串是否相等
            //用两个数组,一个存图片的路径,一个存图片对应的字符串
            listUrl: ['1111.png', '1234.png', '2222.png', '3333.png', '4567.png'],
            listNum: [1111, 1234, 2222, 3333, 4567],

            //记录上一次的图片的下标
            midTag: -1,
            url: './verycode.gif',
            inputStr:''
        },
        methods: {
            //更换图片
            changeImg: function () {
                //判断上一次的tag和这次随机生成的tag是否一致,一致的话就跳出循环
                while (true) {
                    var tag = Math.floor(Math.random() * this.listUrl.length)
                    if (tag != this.midTag) {
                        this.midTag = tag
                        break
                    }
                }

                this.url = this.listUrl[this.midTag]
            },


            onclick1: function () {
                if (this.midTag == -1) {
                    if (this.inputStr == 'bnksu') {
                        alert("验证码正确!")
                    } else {
                        alert("验证码错误!")
                    }
                    return
                }

                var str = this.listNum[this.midTag]
                if (str == this.inputStr) {
                    alert("验证码正确!")
                } else {
                    alert("验证码错误!");
                }
            }

        }
    })


</script>
</body>
</html>

2, 汇率换算------dom操作-- vue操作(dom操作不要)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Homework2</title>
    <script src="../vue.js"></script>
    <style>
        select, button {
            height: 30px;
        }

        input {
            height: 20px;
        }

        .div1 {
            margin-bottom: 5px;
        }

        td {
            width: 200px;
            height: 30px;
            text-align: center;
        }

        /*属性选择器*/
        [colspan] {
            background: red;
        }

        .div2 {
            width: 600px;
            margin: 0 auto;
        }

        .div3 {
            width: 700px;
            margin: 0 auto;
        }
    </style>
</head>
<body>
<div id="root">
    <div class="div2">
        <div class="div1">
            <select id="select1" @change="click1" v-model="select1Value">
                <option value="1">美元</option>
                <option value="2">人民币</option>
                <option value="3">欧元</option>
                <option value="4">日元</option>
                <option value="5">韩元</option>
                <option value="6">港元</option>
            </select>

            <button @click="change1">互换</button>

            <select id="select2" @change="click1" v-model="select2Value">
                <option value="1">美元</option>
                <option value="2">人民币</option>
                <option value="3">欧元</option>
                <option value="4">日元</option>
                <option value="5">韩元</option>
                <option value="6">港元</option>
            </select>

            数额:
            <input id="inputStr" v-model="inputStr">

            <button @click="click1">按汇率换算</button>
        </div>
    </div>

    <div class="div3">
        <table border="1px">
            <tr>
                <td colspan="3">按当前汇率兑换结果</td>
            </tr>
            <tr>
                <td id="td11">{{td11}}</td>
                <td>汇率</td>
                <td id="td13">{{td13}}</td>
            </tr>
            <tr>
                <td id="td21">{{td21}}</td>
                <td id="td22">{{td22}}</td>
                <td id="td23">{{td23}}</td>
            </tr>
        </table>
    </div>
</div>

<script>
    new Vue({
        el: '#root',
        data: {
            listMoney: ['美元', '人民币', '欧元', '日元', '韩元', '港元'],
            ListRate: [1, 7, 0.9, 100, 1000, 8],
            select1Value: 1,
            select2Value: 2,
            inputStr: '',
            td11: '美元',
            td13: '人民币',
            td21: '',
            td22: '',
            td23: ''
        },
        methods: {
            change1: function () {
                var mid = this.select1Value
                this.select1Value = this.select2Value
                this.select2Value = mid
            },

            click1: function () {
                if (isNaN(this.inputStr)) {
                    alert("请输入数字!")
                    return
                }

                //求利率和兑换金额
                var rate = this.ListRate[this.select2Value - 1] / this.ListRate[this.select1Value - 1]
                console.log(rate)

                var money = this.inputStr * rate
                console.log(money)

                //更新表中数据
                this.td11 = this.listMoney[this.select1Value - 1]
                this.td13 = this.listMoney[this.select2Value - 1]
                //如果输入的是空串,数值这一行置为空
                if (this.inputStr == '') {
                    this.td21 = null
                    this.td22 = null
                    this.td23 = null
                } else {
                    //否则的话则表示是点击按汇率计算的button触发的本事件
                    this.td21 = this.inputStr
                    this.td22 = rate
                    this.td23 = money
                }
            }
        }
    })
</script>

<!--这样做的好处是解耦
html和css代码写好,就不需要关注他了, 只需关注Vue对象里有什么操作-->
</body>
</html>

把dom操作换成绑定, 数据移到vue对象的data

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-玫瑰少年-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值