vue基础用法

·  阅读 139

起步:

创建一个Vue对象,所有数据放在data里面,所有方法放在methods里面

<div id="root">
    {{a}} + {{b}} = {{a + b}} <br>
    {{a}} + {{b}} = {{sum()}} <br>
</div>
复制代码
let vm = new Vue({
    el:'#root',
    data:{//数据
        a : 100,
        b : 200
    },
    methods : {
        sum(){
            return this.a + this.b //这里的记得要加this
        }
    }
})
复制代码
  • {{}}:双大括号表示vue表达式:写一些简单的表达式(如:{{new Date()}})
  • vue表达式不能输出到标签里面(不能用来输出属性),只能用到innerHTML里

指令(direction)--补充了html的属性

v-bind: 动态数据绑定,可以简写成‘:’
用于向html属性里面输出东西:v-bind:title、v-bind:src

冒号后面的内容可以是变量或表达式

class:可以直接用数组
style:可以直接用json

<div id="root">
    <div v-bind:title='a'>v-bind:title test</div>

    <div :class='arr'>v-bind:class test</div>

    <div :style='json'>:style test</div>
</div>
复制代码
let vm = new Vue({
    el:'#root',
    data:{
        a: 'hello',
        arr: ['bgc-red','font-20'],
        json:{width:'100px',height:'100px',border:'1px solid','background-color':'blue'}
    }
})
复制代码

v-model:数据双向绑定

数据和input(或其他输入框)之间双向绑定
vue内部自动完成数据控制层

<!-- 在input元素上加v-model属性表示数据双向绑定 -->
<!-- 通过input标签进入的数据都是字符串 -->
<input type="text" v-model='a'> + <input type="text" v-model='b'> = {{ a + b }} <br>
<input type="text" v-model='c'> + <input type="text" v-model='d'> = {{ parseInt(c)  + parseInt(d) }}
复制代码
let vm = new Vue({
    el:'#root',
    data:{
        a: 1,
        b: 2,
        c: 1,
        d: 2  
    }
})
复制代码

注意:通过input进来的数据都是字符串

v-text:没什么用

<div v-text='aaa'></div>
相当于:
<div class="">
  {{aaa}}
</div>

data{
  aaa:111
}
复制代码

v-html:直接输出html

相当于将变量作为innerHTML输出到标签内

<div id="root">
    <!-- v-pre表示预处理,标签里面的内容原样输出 -->
    <p v-pre>使用vue表达式{{}}</p>
    <div>
        {{myHtml}} 
        <!-- 效果为将内容作为字符串输出 -->
    </div>
    <hr>

    <p>使用v-text</p>
    <!-- 效果与{{}}一样 -->
    <div v-text="myHtml"></div>
    <hr>

    <p>用了v-html</p>
    <div v-html = 'myHtml'></div>
    <!-- 将内容作为表单元素输出 -->
</div>
复制代码
let vm = new Vue({
    el:'#root',
    data:{
        myHtml: `
        <form action="">
            username:<input type="text"><br>
            password:<input type="text"><br>
        </form>
        `
    }
})
复制代码

vue事件

语法

v-on:click="fn()" 括号可以不加,只要没参数
简写:@click="fn()"

    <div id="root">
        <!-- 简写为:click -->
        <button v-on:click='test()'>click me</button>
    </div>
复制代码
let vm = new Vue({
    el:'#root',
    methods:{
        test(){
            alert('hello')
        }
    }
})
复制代码

事件修饰符

@click='fn()'

  • @click.stop = 'fn()'//禁止冒泡

  • @click.once 单次事件

  • @click.prevent 阻止默认事件(阻止表单提交)

  • vue事件中的this是window对象

  • 可以多个@click.stop.once

  • @click.native 原生事件,跟组件配合

  • @keydown.数字|ctrl : .keycode|名字, 可以按组合键

  • @click.self: 只触发自己的事件

  • @click.capture 捕获阶段的事件

<div id="root">
    <hr>
    <h3>事件冒泡修饰符:.stop</h3>
    <p>不阻止事件冒泡</p>
    <div @click='divClick()'>
        <button @click='btnClick()'>事件冒泡</button>
    </div>
    <p>阻止事件冒泡</p>
    <div @click='divClick()'>
        <button @click.stop='btnClick()'>事件冒泡</button>
    </div>
    <hr>

    <h3>单次事件: .once</h3>
    <p>只执行一次</p>
    <button @click.once='btnClick()'>单次事件</button>
    <hr>

    <h3>阻止默认事件</h3>
    <form action="http://aaa.com">
        <input type="submit" @click.prevent='submitClick()'>
    </form>
    <hr>
    <h3>键盘事件</h3>
    <!-- 只有获得焦点的元素才能触发 -->
    <button @keydown.ctrl='keydown()'>键盘事件:ctrl</button>
    <button @keydown.ctrl.shift='keydown()'>组合键:ctrl + shift</button>

</div>
复制代码
let vm = new Vue({
    el:'#root',
    methods:{
        divClick(){
            alert('div Clicked')
        },
        btnClick(){
            alert('btn Clicked')
        },
        submitClick(){
            alert('表单不会提交');
        },
        keydown(){
            alert('keydown')
        }
    }
})
复制代码

v-if和v-show

v-if:元素是否存在
v-show:元素是否显示

<div id="root">
    <button @click="toggle1()">toggle1</button>
    <!-- v-if 设置一个元素是否存在dom中 -->
    <div class="div1" v-if="isDivExist" :style='style1'>div1</div>
    <button @click="toggle2()">toggle2</button>
    <!-- v-show 设置一个元素是否显示 -->
    <div class="div2" v-show="isDivShow" :style='style2'>div2</div>
    
</div>
复制代码
let vm = new Vue({
    el:'#root',
    data:{
        style1:{widht:'100px',height:'100px','background-color':'skyblue'},
        style2:{widht:'100px',height:'100px','background-color':'red'},
        isDivExist:true,
        isDivShow:true
    },
    methods:{
        toggle1(){
            this.isDivExist = !this.isDivExist;
        },
        toggle2(){
            this.isDivShow = !this.isDivShow;
        }
    }
})
复制代码

v-for循环

vue 的v-for可以循环:数组、对象、字符串、数字

<div id="root">
    <p>遍历数组</p>
    <ul>
        <li v-for="user,index in users">
            <p>
                username:{{user.username}} <br>
                age:{{user.age}} <br>
                index: {{index}}
            </p>
        </li>
    </ul>
    <p>遍历json</p>
    <ul>
        <li v-for="value,key in json">
            <p>
                {{key}}:{{value}}
            </p>
        </li>
    </ul>
    <p>遍历字符串</p>
    <ul>
        <li v-for="char,index in str">
            {{index}} : {{char}}
        </li>
    </ul>
    <p>遍历数字</p>
    <ul>
        <li v-for="i,index in 10">
            index:{{index}}  value:{{i}}
        </li>
    </ul>
</div>
复制代码
let vm = new Vue({
    el:'#root',
    data:{
        users:[
            {username:'zhangsan',age:'18'},
            {username:'lisi',age:'19'},
            {username:'wangwu',age:'20'}
        ],
        json:{
            a:'aaa',
            b:'bbb',
            c:'ccc'
        },
        str:'abcdefg'
    }
})
复制代码

v-pre

禁用vue表达式:提高性能,防止意外

<!-- v-pre:预编译,禁用vue表达式 -->
<div v-pre>
    {{}}是vue的表达式
</div>
复制代码

v-cloak

防止vue代码(如{{}}符号)意外显示

<style>
    [v-cloak]{
        display: none;
    }
</style>
<!-- 页面未加载玩完时会有这个属性 -->
<div v-cloak>
    {{a}}
</div>
复制代码
function sleep(d){
    for(let t = Date.now();Date.now() - t <= d;);
}
sleep(1000)
let vm = new Vue({
    el:'#root',
    data:{
        a:'hello'
    }
})
复制代码

computed-计算属性

computed的优势

  • 带缓存:性能更高(只有数据变了才会计算)
  • 方便:即可以读,又可以写
    <div id="root">
        {{a}} + {{b}} = {{sum}}
    
        <p>姓名分解</p>
        姓:<input type="text" v-model='familyName'>
        名:<input type="text" v-model='givenName'>
        姓名: <input type="text" v-model="nameCalc">
    </div>
复制代码
let vm = new Vue({
    el:'#root',
    data:{
        a: 1,
        b: 2,
        familyName:'张',
        givenName:'三'
    },
    computed:{
        sum(){
            return this.a + this.b;
        },
        nameCalc:{
            set(value){//设置data
                this.familyName=value.substring(0,1);
                this.givenName=value.substring(1);
            },
            get(){
                return this.familyName + this.givenName;
            }
        }
    }
})
复制代码

watch--监听:

<div id="root">
    <input type="text" v-model="a">
    {{a}}
</div>
复制代码
let vm = new Vue({
    el:'#root',
    data:{
       a:'aaa'
    },
    watch:{
        a(newVal,oldVal){
            alert(`a changed: newVal:${newVal},oldVal:${oldVal}`)
        }
    }
})
复制代码

最后

最近几天在学习vue,整理了下vue的基础语法,之后会将vue组件,路由,vue-cli,vuex等内容整理出来

分类:
前端
标签: