第三阶段-day5-7_Vue

Vue

1.1 Vue的定义

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

  • 渐进式:从核心到完备的全家桶(需要什么引用什么)

Vue本身语法内容并不多, 生态是很庞大的

 

https://cn.vuejs.org/index.html

可以到这里来学

  • 增量:从少到多,从一页到多页,从简单到复杂
  • 单文件组件: 一个文件描述一个组件
  • 单页应用: 经过打包生成一个单页的html文件和一些js文件

 

为什么要讲vue? 项目前端都是Vue, 国内前端框架市场基本上70%以上都是使用vue这个框架

或者不是用框架写的前端旧的项目jsp 模板技术  )

 

框架:   工程化的角度

所谓框架就是在工程化实现一个东西的时候构建的大的轮廓, 和提供一些基础性的设施

后来者,或者使用者, 可以在这个框架的基础上, 迅速的把要实现的目标实体快速构建出来

  • vue基本语法(简单)
    • 简洁,轻量,快速,数据驱动,模块友好,组件化

 

现在的前端是组件化的天下

 

1.2 Vue课程

分为两部分

1, 先讲vue基本语法

2, 怎么创建项目--> vue中开发页面--->打包项目---> 怎么部署

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

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

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

 

1.3 一个Vue页面用html

安装vue

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

 

 

方法二引入的是一个资源文件,在cdn.jsdelivr.net这个服务器上,假如没有网,这个服务器不能打开。所以我们不这样。直接把它下载。

用浏览器访问这个网址 https://cdn.jsdelivr.net/npm/vue@2.6.11

 

 

 

 

这样的话,还是要走网络请求,但走的是本机。断网了还是能访问到。

 

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


<!-- 一个div 他的id 是root -->
<!-- 在vue中 {{}}: 叫插值表达式 ,
这个插值表达式之中是一个js式子,
这个式子的对应参数要去对应关联的vue对象中去取 , 一般去vue对象的data里面去取-->
<div id="root">
    {{msg}}
    {{msg + aaa}}
</div>

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

</script>


<!--生产:  生产环境 ,(代表实际在线上运行的代码, 可以供用户访问的程序),要稳定,不能动不动就挂了,数据要完整
    开发: 开发环境,
    测试: 测试环境

    程序开发 (提测, 回归测试..)---测试测试----运维
    -->


</body>
</html>

 

 

 

Dom解析:从上到下解析。

解析到div时,里面的{{msg}}、{{msg + aaa}}不变,还不知道是什么东西,就在页面上显示{{msg}}、{{msg + aaa}},就像普通字符一样。

一直向下解析,解析到script时,创建了一个vue对象,

把这个对象创建出来了之后,它开始找这个对象所指向的el,一个id= root的东西

就又回去看div,发现确实有id= root的东西,

接着它就发现里面有{{msg}}、{{msg + aaa}}表达式的东西,是vue语法

接着,它在vue对象的data中找,看有没有msg,有就替换掉,有没有aaa,有就替换掉。

就显示出了结果。

 

vue,第一步,就是把vue语法导进来,很多同学经常忘

 

 

1.4 V指令

  •  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.5 .1 V-bind: 单向绑定

v-bind: 用来绑定数据和属性以及表达式,缩写为’:’

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

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

        注意: v-bind: 可以简写成一个 :
-->

<div id="root">
    {{msg}}
    {{inputStr}}
    <div v-bind:title='aaa'>
        我是一个div
    </div>
    <div :title='aaa'>
        我是一个div
    </div>
    <input v-bind:value="inputStr">

<!--    <input value="inputStr...">-->
</div>

<script>
    new Vue({
        el: "#root",
        data: {
            msg: 1234,
            aaa: '我是一个vue对象中的值',
            inputStr: 'inputStr...'
        }
    })
</script>


</body>
</html>

 

 

1.5.2 V-model:  双向绑定

 v-model:实现双向数据绑定

v-model: 双向绑定, 改变或者绑定,是个双向的

  1. 和v-bind作用相同, 去对应的vue对象里的data取值, 把取到的值赋值给所绑定的对象
  2. v-model绑定的参数,  当这个参数(在html中)发生改变的时候, 他会同时去修改对应vue对象中data里面所对应的值
  • 注意: 双向绑定v-model:  一般用于表单元素的value属性,所以有时候可以省略的写  v-model="***"
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
</head>
<body>

<!--v-model: 双向绑定, 改变或者绑定,是个双向的
 1, 和v-bind作用相同, 去对应的vue对象里的data取值, 把取到的值赋值给所绑定的对象
 2, v-model绑定的参数,  当这个参数(在html中)发生改变的时候, 他会同时去修改
    对应vue对象中data里面所对应的值

    注意: 双向绑定v-model:  一般用于表单元素的value属性
            所以有时候可以省略的写  v-model="***"
 -->


<div id="root">
    {{msg}}
    <input v-bind:value="msg">

    <input v-model:value="msg">
    <input v-model="msg">

    <select v-model="msg">
        <option value="123">123</option>
        <option value="321">321</option>
    </select>
</div>

<script>
   new Vue({
       el: '#root',
       data: {
           msg: 123
       }
   })
</script>

</body>
</html>

 

 

 

1.5.3 V-text   v-html

类似于dom操作中的 innerText   innerHTML

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

<div id="root">
    <div v-text="aaa"></div>
    <div v-html="bbb"></div>
</div>

<script>
    new Vue({
        el:'#root',
        data: {
            aaa: 'aaaa',
            bbb: '<b>bbbb</b>'
        }
    })
</script>


</body>
</html>

 

 

 

 

 

 

 

1.5.4 V-on:   事件监听

v-on: 绑定事件监听器。可简写@

<!--v-on:标识vue语法的事件监听,把监听到的事件, 触发到 对应vue对象的methods里面去-->
<!-- vue中没有onclick -->

 

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

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

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

        可以简写: v-on: 可以简写成 @
-->
<!-- vue中没有onclick -->

<div id="root">
    {{msg}}
<!--    <button onclick="f1()">点击</button>-->
    <input v-model="aaa">
    <button v-on:click="f1">点击</button>
    <button @click="f1">点击</button>
</div>

<script>
    // function f1() {
    //     alert(123)
    // }
    new Vue({
        el: '#root',
        data: {
            msg:123,
            aaa: ''
        },
        methods:{
           f1: function () {
               this.msg = this.aaa
           }
        }
    })

    // 耦合:
    // 解耦: 写程序, 贯穿我们整个程序生涯是始终
    //         把强关联性的东西变成弱关联

</script>


</body>
</html>

耦合就是相互交织在一起。一个东西嵌套另一个东西,嵌套得特别紧密。

两个方法很紧密,为什么不写成一个方法,要写成两个方法?东西多了,可能出现问题,不好改。写成多个,好修改。

分布式——为了避免一个服务挂掉,整个服务挂掉。

 

 

1.5.5 V-show

v-show:签控制隐藏, (display设置none)

 

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


<!--注意2: 在v-show的判断条件里, 可以写表达式-->

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


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

<!--注意2: 在v-show的判断条件里, 可以写表达式-->

<div id="root">

    <div v-show="bool">
        我是一个div
    </div>

    <div v-show="msg=='1234'">
        我是一个div
    </div>

    <div v-show="'123'">
        我是一个div123
    </div>

    <button @click="change1">隐藏和显示</button>

</div>
<script>
    new Vue({
        el:'#root',
        data: {
            bool: false,
            msg: '123'
        },
        methods: {
            change1: function () {
                this.bool = !this.bool
            }
        }
    })

</script>

</body>
</html>

 

 

 

 

1.5.6 V-if

v-else-if     v-else

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
</head>
<body>
<div id="root">
    <div v-if="bool1">
        div1
    </div>
    <div v-else-if="bool2">
        div2
    </div>
    <div v-else>
        div3
    </div>
</div>

<script>
    new Vue({
        el: '#root',
        data: {
            bool1: true,
            bool2: false
        }
    })
</script>

</body>
</html>

 

v-if和v-show的区别:  

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

 

 

 

 

 

1.5.7 V-for

vu中对应的html代码中创建一个循环结构

 

<!--注意1: 循环渲染的,到底是什么?
            循环渲染的, 是v-for这个指令所在的html元素
注意2: v-for指令必须要和 :key配套出现
            并且key值唯一, 不可重复

            (aaa, index) in list"
            index代之循环遍历的下标
    注意3:  v-for 这个循环, 可以用 of/in 两种形式来循环
-->

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

<!--注意1: 循环渲染的,到底是什么?
            循环渲染的, 是v-for这个指令所在的html元素
-->

<!--注意2: v-for指令必须要和 :key配套出现
            并且key值唯一, 不可重复

            (aaa, index) in list"
            index代之循环遍历的下标
-->

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

<div id="root">
    <div v-for="(aaa, index) of list"   :key="index">
        {{aaa}}--{{index}}
    </div>


    <div v-for="item in list2" :key="item.id">
        <img :src="item.src">
    </div>

    <button @click="f1">点击</button>

</div>
<script>
    new Vue({
        el:'#root',
        data:{
            list: ['1', '22', '333', '4444'],
            list2: [{
                id: 1,
                src: '1111.png'
            },
                {
                    id: 2,
                    src: '2222.png'
                }
            ]
        },
        methods: {
            f1: function () {
                this.list2[0].src = '1234.png'
            }
        }
    })
</script>

</body>
</html>

 

 

 

案例

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


<div id="root">
    <div v-for="(item, index) in list" :key="index" @click="delete1(index)">
        {{item}}
    </div>
    <input v-model="inputstr"><button @click="add">添加</button>
</div>
<script>
    new Vue({
        el: '#root',
        data: {
            list: ['123', '456', '789'],
            inputstr: ''
        },
        methods: {
            add: function () {
                this.list.push(this.inputstr)
                this.inputstr = ''
            },
            delete1: function (parm) {
                this.list.splice(parm, 1)

            }
        }
    })
</script>


<!--  有时候 某些形式修改list的时候, v-for是不会重新渲染的   -->


</body>
</html>

 

 

 

 

 

 

<!--  有时候 某些形式修改list的时候, v-for是不会重新渲染的   -->

 

 

1.5.8 V-pre

 v-pre可以用来阻止预编译,有v-pre指令的标签内部的内容不会被编译,会原样输出。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
</head>
<body>
<div id="root">
    <div v-pre>
        {{msg}}
    </div>
</div>
<script>
    new Vue({
        el: '#root',
        data: {
            msg: 123
        }
    })
</script>
</body>
</html>

 

 

 

 

1.5.9 v-cloak

  •  延迟显示。
  • 这个指令保持在元素上直到关联实例结束编译。和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 标签直到实例准备完毕
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
    <style>
        [v-cloak]{
            /*display: none;*/
            font-size: 100px;
            background: red;
        }
    </style>
</head>
<body>
<div id="root">
    <div v-cloak>
        {{msg}}
    </div>
</div>
<script>

    // setTimeout  在多少毫秒秒之后,执行什么什么东西
    setTimeout('f()', 3000)

    function f() {
        new Vue({
            el:'#root',
            data:{
                msg: 4444
            }
        })
    }
</script>

</body>
</html>

 

 

 

 

如果vue对象没创建,div中v-cloak是一个自定义属性,在style标签中对这个属性做了监控:如果有这个属性,就让他隐藏掉display: none

vue对象加载出来了,它看到里面的v-cloak,就立马把div中的v-cloak干掉,style中的属性选择器就没有对应的属性了,div中的内容就会显示出来了。

1.5.10 V-once

只加载一次(只编译一次)

  • 只渲染元素和组件一次。随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过。这可以用于优化更新性能。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
</head>
<body>
<div id="root">
    <div v-once>
        {{msg}}
    </div>
    {{msg}}
    <input v-model="msg">
</div>

<script>
    new Vue({
        el: '#root',
        data: {
            msg: 123
        }
    })
</script>

</body>
</html>

 

 

 

重点

V指令, 好好练一下

 

day5作业

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

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

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

 demo1

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</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>2000</option>
                    <option>2000</option>
                    <option>2000</option>
                </select><select>
                    <option>00</option>
                    <option>00</option>
                    <option>00</option>
                    <option>00</option>
                </select><select>
                    <option>00</option>
                    <option>00</option>
                    <option>00</option>
                    <option>00</option>
                </select></td>
        </tr>
        <tr>
            <td align="right">我正在:</td>
            <td>
                <select>
                    <option>学习</option>
                    <option>睡觉</option>
                    <option>机器学习</option>
                    <option>00</option>
                </select>
            </td>
        </tr>
        <tr>
            <td></td>
            <td>
                <!--span就是一个标签,不会影响你的内容-->
                <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 @click="click1" src="btn_reg.gif">
            </td>
        </tr>
    </table>
</div>


<script>

    new Vue({
        el:'#root',
        data:{
            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() {
                var bool = true
                //新验证码索引与前一次验证码索引值相同,则一直循环,直到值不同为止
                while(bool){
                    var tag = Math.floor(Math.random()*this.listurl.length)
                    if(tag == this.midTag){
                        //新验证码索引与前一次验证码索引值相同
                    }else{
                        //索引值不同
                        bool = false
                        this.midTag = tag
                    }
                }
                this.url = this.listurl[this.midTag]
            },

            click1:function () {
                if(this.midTag == -1){
                    if(this.inputStr == "bnksu"){
                        alert("验证码正确")
                    }else{
                        alert("验证码错误")
                    }
                    return
                }
                var str = this.listNum[this.midTag]
                if(this.inputStr == str){
                    alert("验证码正确")
                }else{
                    alert("验证码错误")
                }
            }
        }
    })

</script>

</body>
</html>

 

demo2

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>

        select, button{
            height: 30px;
        }
        input{
            height: 20px;
        }
        .div2{
            margin-bottom: 5px ;
        }

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

        [colspan] {
            background: red;
        }
        .div1{
            width: 610px;
            margin: 0 auto;
        }
    </style>
    <script src="vue.js"></script>
</head>
<body>
<!--实现汇率换算页面(点击互换和汇率换算)-->

<div class="div1" id="root">

    <div class="div2">
        <select id="select1" 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" 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="change2"> 按汇率换算</button>

    </div>
    <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>

<script>

    new Vue({
        el:'#root',
        data:{
            listRate :[1, 7,  0.9 , 100, 1000, 7],
            listM :['美元', '人民币', '欧元', '日元', '韩元', '港元'],
            select1Value:1,
            select2Value:1,
            inputStr:'',
            td11:'美元',
            td13:'人民币',
            td21:'100',
            td22:'7',
            td23:'700'

        },
        methods:{
            change1:function() {
                var mid = this.select1Value
                this.select1Value = this.select2Value
                this.select2Value = mid
            },

            change2:function() {
                //select2.value - 1 是因为select2的value的下标是从1开始的。
                var rate = this.listRate[this.select2Value -1] / this.listRate[this.select1Value -1]
                var money =  this.inputStr*rate

                this.td11=this.listM[this.select1Value-1]
                this.td13=this.listM[this.select2Value-1]
                this.td21= this.inputStr
                this.td22= rate
                this.td23= money
            }

        }
    })

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

 

 

day6

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:  只加载一次

1.6 计算属性

computed: 一个属性是通过别的属性计算而来是个属性(虽然看起来, 看起来像个方法但是外在表现是个属性)

计算属性所计算的时机:  当它依赖的属性发生变化的时候, 那么它就会重新计算

不是存在于data里的一个参数, 存在computed

computed: {
    sum: function () {
        return this.num1 + this.num2
    }
},

 

function来做

 

 

 

computed来做

 

 

 

1.7 侦听器

watch: 监听器侦听一个vue对象中属性的变化, 然后触发一些操作

 

Watch:  vue对象的一个固有属性, 里面写侦听器

 注意: 我们如果想侦听那个参数发生改变, 侦听器的方法名就是该参数

 

watch: {
    msg: function () {
        this.changetimes ++
    }
}

 

 

 

1.8 模板

Template:  模板是vue对象(此时此刻写法) 是一个以标签包裹的html代码块

模板会替换挂载的元素

  •  一个字符串模板作为 Vue 实例的标识使用。模板将会 替换 挂载的元素。挂载元素的内容都将被忽略(除非模板的内容有分发插槽 v-solt)。
new Vue({
    el:'#root',
    template: '<div>567</div>',
    data: {
        msg: 123
    }
})

 

 

1.9 组件

把一个整体的东西拆分成不同的东西

表现在我们前端里, 就是把一个页面拆分成不同的分块来实现

表现在我们vue里, 把一个页面拆分成多个vue对象来实现

vue中更深层次的表现, 就是,把一个页面关联成一个vue对象(入口对象), 这个对象有一系列子对象(子对象通过某种途径和入口对象建立引用关系), 构建出一种类似于dom树结构, 组件树(对象树)

 

组件vue中就是vue对象

 

 

 

如上图,左边是一个网页,一整个页面,首先是一个对象,一个绿色的小方块就是一个对象,通过某种途径,下面关联三个——浅灰色的vue对象,这三个vue对象分别处理这三块内容,第二个浅灰色,它下面又分了两个vue对象来处理;第三个浅灰色,它里面又分了三个深灰色vue对象来处理。

 

dom树没有任何区别,只不过里面的dom节点,现在变成了vue对象,就是组件。

 

1.10 html中有两种组件的写法

1.10.1 全局组件

 

 

 

1.10.2 局部组件

 

 

 

安装一下Node

 

 

 

默认安装

判断安装是否成功?

 

 

 

 

 

1.10.3 前后端分离

前端和后端分离:   工程上的分离, (分为前端项目,  分为后端项目)

对于前后端不分离的来说,  数据和前端代码的结合----服务器

 

前后端不分离的项目(前端和后端属于一个项目)

 

前后端分离的写法:   数据结合-----浏览器

 

 

1.10.4 组件间传值: 向下(父组件传给子组件)传值

Props

  • props 用于接收来自父组件的数据。props 可以是简单的数组,或者使用对象作为替代,对象允许配置高级选项,如类型检测、自定义验证和设置默认值。

v-bind :  单向绑定

 

传值

 至少要分两步,  

第一步:递(父组件, 传递通过v-bind)   

 第二步接收(子组件接收, 通过 props)

 

 

 

 

 

1.10.5 组件间传值: 向上(子组件传递给父组件)

也要有两个动作:  

1: 子组件通知父组件:  emit

2: 父组件监听子组件:  自定义方法

 

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

<div id="root">
<!--    接收子组件抛出方法(参数没有,或者一个的写法)-->
<!--    <aaa v-for="(item, index) in list"-->
<!--         :key="index"-->
<!--         v-bind:bbb="item"-->
<!--         @ccc="delete1"-->
<!--    ></aaa>-->

    <!--传多个参数-->
    <aaa v-for="(item, index) in list"
         :key="index"
         v-bind:bbb="item"
         @ccc="delete1(arguments)"
    ></aaa>
</div>
<script>
    Vue.component('aaa', {
        props: ['bbb'], // 不能修改
        template: '<div><div @click="click1">{{bbb}}</div></div>',
        methods: {
            click1: function () {
                // this.$emit('ccc', 1) // 传递一个参数
                this.$emit('ccc', 1, 2)
            }
        }
    })
    new Vue({
        el:'#root',
        data: {
            list: [ '1' , '2', '3', '4']
        },
        methods: {
            delete1: function (arguments) {
                console.log('')
                console.log(arguments)
            }
        }
    })
</script>

</body>
</html>

点击删除

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

<div id="root">
<!--    接收子组件抛出方法(参数没有,或者一个的写法)-->
    <aaa v-for="(item, index) in list"
         :key="index"
         v-bind:bbb="item"
         v-bind:index="index"
         @ccc="delete1"
    ></aaa>
</div>
<script>
    Vue.component('aaa', {
        props: ['bbb', 'index'], // 不能修改
        template: '<div><div @click="click1">{{bbb}}--{{index}}</div></div>',
        methods: {
            click1: function () {
                this.$emit('ccc', this.index) // 传递一个参数
            }
        }
    })
    new Vue({
        el:'#root',
        data: {
            list: [ '1' , '2', '3', '4']
        },
        methods: {
            delete1: function (parm) {
                this.list.splice(parm, 1)
                console.log(parm)
            }
        }
    })
</script>

</body>
</html>

 

 Vue生命周期

从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程,我们称这是Vue的生命周期。通俗说就是Vue实例从创建到销毁的过程,就是生命周期。

生命周期函数

  • beforeCreate
  • Created
  • beforeMount
  • Mounted
  • beforeUpdtae
  • Updated
  • beforeDestroy
  • destoryed

Vue的生命周期方法,是vue对象固有的

 

创建------挂载------改变-----销毁

 

beforeCreate:function () {
    console.log("控制台打印:beforeCreate")
},
created:function () {
    console.log("控制台打印:created")
},
beforeMount:function () {
    //页面还未被渲染
    console.log(this.$el),
    console.log("控制台打印:beforeMount")
},
mounted:function () {
    //页面渲染完成
    console.log(this.$el),
    console.log("控制台打印:mounted")
},
beforeDestroy:function () {
    console.log("控制台打印:beforeDestory")
},
destroyed:function () {
    console.log("控制台打印:destroyed")
},
beforeUpdate:function () {
    console.log("控制台打印:beforeUpdate")
},
updated:function () {
    console.log("控制台打印:updated")
}。

 

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


<div id="root">
    {{msg}}
    <input v-model="msg">

</div>
<script>

    var root = new Vue({
        el:"#root",
        data: {
            msg: 123
        },
        beforeCreate:function () {
            console.log("控制台打印:beforeCreate")
        },
        created:function () {
            console.log("控制台打印:created")
        },
        beforeMount:function () {
            //页面还未被渲染
            console.log(this.$el),
                console.log("控制台打印:beforeMount")
        },
        mounted:function () {
            //页面渲染完成
            console.log(this.$el),
                console.log("控制台打印:mounted")
        },
        beforeUpdate:function () {
            console.log("控制台打印:beforeUpdate")
        },
        updated:function () {
            console.log("控制台打印:updated")
        },
        beforeDestroy:function () {
            console.log("控制台打印:beforeDestory")
        },
        destroyed:function () {
            console.log("控制台打印:destroyed")
        }
    })
</script>

</body>
</html>

Destory方法,要借助浏览器展示,(是浏览器的方法)。

 

删除了root对象后,再update root,就不更新了。因为root对象已经被删除了。

 

还有三个没讲(不常用到)

 

2前端

2.1各种端的概念

前端

移动web,  webapp:   

pc端 , 

小程序:  

一个人:  前端的壁垒在哪

另一个人:  你谈什么壁垒, 你都被小程序打到家门口

Pwa:  让前端替代所有端

 

要替代一切可以显示的东西网页, app, 浏览器

暂时没有成功,  

 

假如成功?  

Wxml  wxss  js  

 

H5 , 

大前端: (WEB统一):    前端统一所有端

 

游戏:  游戏引擎

app开发:  原生开发(贴近于底层语言开发,  安卓:java.  苹果: object-c    ),    

非原生开发:  vue 

 

2.3当下前端的核心

三个基础( html  css   js), 三个框架

3三大框架

3.1什么是框架 ?

一些基础性,准备性的东西

3.2什么是前端框架?

框架是一个半成品,

已经对基础的代码进行了封装并提供相应的API,

开发者在使用框架时直接调用封装好的api可以省去很多代码编写,从而提高工作效率和开发速度..

比如前端框架封装的一些功能:  html文档操作,漂亮的各种控件(按钮,表单等等),可以帮助快速的构建网站.

3.3三个框架

前端现在基本上围绕着三大前端框架

3.3.1Vue

前端框架

尤雨溪  写的,上海人。在美国上大学,google工作,他写的Vue.

 

3.3.2React

React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设Instagram 的网站。做出来以后,发现这套东西很好用,就在2013年5月开源了。

3.3.3Angular

AngularJS 是以一个 JavaScript 文件形式发布的,可通过 script 标签添加到网页中

Angualr 基于 TypeScript  react、vue 相比, Angular 更适合中大型企业级项目。

 

3.4三个框架的对比

 

 

 

如果是JavaScript爱好者,使用React,因为它完全与JavaScript有关。

如果更喜欢灵活性,使用React。

如果喜欢在TypeScript中编码,选择Angular。

如果喜欢面向对象的编程,使用Angular。

如果喜欢干净的代码,使用Vue。

Vue提供最简单的学习曲线,是初学者的理想选择。(学习曲线比较平稳)

如果要在应用程序中分离关注点,使用Vue。

Vue非常适合小型团队和小型项目。如果应用程序很大并且具有重要的未来扩展计划,选择React或Angular。(不是很赞同)

 

Vue最容易: 学习曲线最平滑

React: 次之

Angular: 最难

Vue vue.js

4其它

4.1学习vue和开发vue前端项目我们要用到的

4.1.1 node npm

类比:(  js->node   ,    java->虚拟机  )

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。

Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型。

 

Npm:  包管理工具

NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题

允许用户从NPM服务器下载别人编写的第三方包到本地使用。

允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。

允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了。

 

 

4.1.2 webpack

作用:  打包前端项目

 

webpack可以看做是模块打包机:

它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(TypeScript等),并将其转换和打包为合适的格式供浏览器使用.

简单的说就是打包,压缩各种静态资源的工具

目的à(性能优化,减少浏览器向服务器的请求次数,节约服务器的带宽资源)

 

4.1.3 ESLint

ESLint最初是由Nicholas C. Zakas 于2013年6月创建的开源项目。它的目标是提供一个插件化的javascript代码检测工具

 

一些正规的公司,强制性用eslint,规范前端(每个语言都会经历  刚开始非常乱---慢慢规范起来的过程。前端现在处于非常乱的时期)

 

4.2前端里程碑和其它重要技术

jQuery: JavaScript框架(对js进行很多封装的东西)

提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计

TypeScript: 类似JavaScript

Js的超集

Microsoft 开发和维护的一种面向对象的编程语言。它是JavaScript的超集

 

 

Flutter:谷歌的移动UI框架

可以快速在iOS和Android上构建高质量的(不是纯原生)原生用户界面。

React Native:移动应用开发框架

Facebook的跨平台移动应用开发框架,框架 React 在原生移动应用平台的衍生产物

WEEX:移动应用开发框架

阿里项目,目前 Vue.js 和 Rax(阿里内部一个项目) 这两个前端框架被广泛应用于 Weex 页面开发

 

原生开发

Iosà Objective-C

Android->java

 

UI框架(组件)和UI

 

Ui: 工作职位, (艺术)

UI框架: 实际上是前端程序员,根据经验整理的一些具用共性的样式,图标  (java----第三方bao)

 

学前端路线

先把html、css、js三个基础的搞熟,多写点,再学框架。

有时间再学vue, 再看es6、webpack,再搞搞flutter(移动开发),如果不想搞移动开发,可以搞搞小程序。

posted @ 2022-05-04 02:26  dust--  阅读(34)  评论(0编辑  收藏  举报