Vue

Vue的定义:

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

渐进式:从核心到完备的全家桶(需要什么引用什么)
Vue本身语法内容并不多, 生态是很庞大的

增量:从少到多,从一页到多页,从简单到复杂
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
</head>

V-bind:单向绑定

<!--v-bind: 单向绑定
        把vue对象中data里的值,绑定到html对应是属性上去, 赋值给对应的属性-->
<div id="root">
    {{msg}}
    {{inputStr}}
    <div v-bind:title='aaa'>
        我是一个div
    </div>
    <div :title='aaa'>
        我是一个div
    </div>
    <input v-bind:value="inputStr">

</div>

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

V-model:双向绑定

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

注意: 双向绑定v-model:  一般用于表单元素的value属性
<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>

V-text v-html

类似于dom操作中的 innerText innerHTML

V-on:事件监听

把监听到的事件, 触发到 对应vue对象的methods里面去
<!-- vue中没有onclick -->
<!--注意1:  在vue中, 如果要在方法或者别的钩子函数里, 要访问data里的值,  
            要通过  this.参数名  来访问
            这个this 就是指代这个vue对象-->
<div id="root">
    {{msg}}
<!--    <button onclick="f1()">点击</button>-->
    <input v-model="aaa">
    <button v-on:click="f1">点击</button>
    <button @click="f1">点击</button>
</div>

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

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>

V-if:

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

V-for:

<!--注意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>

V-pre:

v-pre可以用来阻止预编译,有v-pre指令的标签内部的内容不会被编译,会原样输出。
<div id="root">
    <div v-pre>
        {{msg}}
    </div>
</div>
<script>
    new Vue({
        el: '#root',
        data: {
            msg: 123
        }
    })
</script>

V-cloak:

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

V-once:

只加载一次(只编译一次)
<div id="root">
    <div v-once>
        {{msg}}
    </div>

    {{msg}}
    <input v-model="msg">

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

案例:

<!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>

1.6计算属性:

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

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

不是存在于data里的一个参数, 存在computed
<div id="root">

    数1: <input v-model="num1"><br>
    数2: <input v-model="num2"><br>
    和: {{sum}}


    <button @click="aaa">点击</button>
</div>
<script>

    new Vue({
        el: '#root',
        data: {
            num1: 0,
            num2: 0

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

</script>

1.7监听器:

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

Watch:  是vue对象的一个固有属性, 里面写侦听器
注意: 我们如果想侦听那个参数发生改变, 侦听器的方法名就是该参数
watch: {
    msg: function () {
        this.changetimes ++
    }
}
<div id="root">
    改变次数: {{changetimes}}<br>
    {{msg}}
    <input v-model="msg">
</div>
<script>
    new Vue({
        el:'#root',
        data: {
            msg: 12,
            changetimes:0
        },
        watch: {
            msg: function () {

                this.changetimes = this.changetimes +2
            }
        }
    })

</script>

1.8模板:

Template:  模板是vue对象(此时此刻写法) 是一个以标签包裹的html代码块
模板会替换挂载的元素

一个字符串模板作为 Vue 实例的标识使用。模板将会 替换 挂载的元素。挂载元素的内容都将被忽略(除非模板的内容有分发插槽 v-solt)。

new Vue({
    el:'#root',
    template: '<div>567</div>',
    data: {
        msg: 123
    }
})
<div id="root">
    {{msg}}
</div>

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

1.9组件:

把一个整体的东西拆分成不同的东西, 
表现在我们前端里, 就是把一个页面拆分成不同的分块来实现
表现在我们vue里, 把一个页面, 拆分成多个vue对象来实现
在vue中更深层次的表现, 就是,把一个页面关联成一个vue对象(入口对象), 这个对象有一系列子对象(子对象通过某种途径和入口对象建立引用关系), 构建出一种类似于dom树结构, 组件树(对象树)

组件: 在vue中就是vue对象

全局组件:

<div id="root">
    <aaa></aaa>
    <bbb></bbb>
    <ccc></ccc>
</div>


<script>
    // 全局组件:  直接注册一个vue对象, 在vue域里面使用
    // 通过Vue.component创建出一个vue对象, 给这个vue对象起一个名字
    // 那么, 我们在vue域里面就可以直接使用以该对象名字为标签的组件
    Vue.component( 'aaa', {
        template: '<div>111</div>'
    })
    Vue.component( 'bbb', {
        template: '<div>222</div>'
    })
    Vue.component( 'ccc', {
        template: '<div>333</div>'
    })

   new Vue({
       el: '#root',
       data: {

       }
   })
</script>

局部组件:

<div id="root">
    <abc></abc>
    <b-bb></b-bb>
    <ccc></ccc>
</div>

<script>

    // 局部组件:  局部起作用, 必须要在别的vue对象中引入它,, 它才具有vue对象的意义
    // 声明的时候这就是一个普普通的js对象
    var aaa = {
        template: '<div>123</div>'
    }
    var bbb = {
        template: '<div>456</div>'
    }
    var ccc = {

        template: '<div>789</div>'
    }
    new Vue({
        el: '#root',
        components: {
            // 经过这一步, 就把一个js对象变成了一个vue对象
            // 如果组件名存在大写字符, 那么使用的时候把除首字母之外的大写字母转化为  -小写  的模式
            abc: aaa,
            BBb: bbb,
            Ccc: ccc
        },
        data: {

        }
    })
</script>

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

Props
v-bind :  单向绑定

传值: 
 至少要分两步,  
第一步:递(父组件, 传递通过v-bind)   
 第二步: 接收(子组件接收, 通过 props)

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

也要有两个动作:  
1: 子组件通知父组件:  emit
2: 父组件监听字组件:  自定义方法

案例1:
<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>
案例2:
<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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值