vue基础知识

1. es6与es5的对比:

var a = '10' //es5
let b = '10' //es6

let 声明变量的特点
  1 let申明的变量不再从属于顶层对象window
     let username = 'bob'
    window.username;
    结果:undefined

  2 let申明的变量var不能重复声明
  3 let中不存在变量提升
     es5中:
        console.log(hh2);
        var hh2 = 'ss';
        结果: undefined
        
     es6中
        console.log(hh);  // 报错
        let hh = 'ss';

const可声明常量,不能修改
    const Pi = 3.1415926....
    const Pi = 11 //报错

模板语法
let a = '11'
let name = `${a}22`
name:结果"1122"

es5和es6的函数对比

// es5
function add(x,y){
   return x+y
}
add(1,2);
// 匿名函数
var add = function(x){
  return x
}
// es6 
// 匿名函数
let add = function(x){
  return x
}
// 箭头函数
let add = (x) => {
    return x
}
// 简写形式
let add = x => x ; 
let add = (x,y) => x+y

自定义对象中封装函数的写法

// es5中自定义对象里面封装函数
var name = 'bob'
var person = {
  name:'jack',
  age:18,
  f1:function(){
        console.log(this);
        console.log(this.name); // 
    }
}
person.f1()  //结果为Jack, 这个是谁调用this就指向谁

// 箭头函数 -- var
var name = 'bob'
var person = {
  name:'jack',
  age:18,
  f1:()=>{
        console.log(this);  //指向window
        console.log(this.name); //  结果为bob  箭头函数会将this指向上一级里的对象
    }
}
person.f1()
// 箭头函数 -- es6
let name = 'bob'
let person = {
  name:'jack',
  age:18,
  f1:()=>{
        console.log(this); // Window {parent: Window, opener: null, top: Window, length: 2, BigInt: ƒ, …}
        console.log(this.name); 
    // 结果为undefined  因为let不会改变this的指向, 所以this指向window, 又let不会做变量提升, 所以不会把name从属于window, 所以结果undefined
    }
}
person.f1()

// 函数单体模式
let name = 'bob'
let person = {
  name:'jack',
  age:18,
  //f1:function(){
  f1(){ //不会改变this的指向
        console.log(this);
        console.log(this.name); // 结果为jack
    }
}
person.f1()

es5和es6中类写法

// es5 没有类的概念,写法
function Person(name,age){
    this.name = name;  // 类似于self
  this.age = age;
}
// 使用
var p1 = new Person('bob', 16);
p1.name;
    结果:"bob"
// es5封装方法,原型链
Person.prototype.f2 = function(){console.log('xxxxxx')};
p1.f2();  // 结果'xxxxxx'

//es6  class声明类(了解)
class Person2{
    constructor(name,age){
        this.name = name;
        this.age = age;
    }
    
    showName(){console.log(this.name)};
};

let p3 = new Person2('jack',16);
  p3.name;
  "jack"
  p3.showName();
  jack

2. 视图中的简单语法

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

<div id="app">
    <h1>{{ name }}</h1>
    <h1>{{ num }}</h1>
    <h1>{{ data_list }}</h1>
    <h1>{{ info }}</h1>
    <h1>{{ info.weather }}</h1>  <!-- 属性取值 -->
    <h1>{{ str_words }}</h1>
    <h1>{{ 3+2 }} </h1>
    <h1>{{ str_words.split("").reverse().join("") }}</h1> <!-- 字符串反转 -->
    <h1>{{ num+1 }}</h1>  <!-- 四则运算 -->
    <h1>{{ 1>2?"真":"假" }}</h1>  <!-- 三元运算、三目运算 -->
    <h1>{{ num>2?"真":"假" }}</h1>
    
</div>

</body>
<script src="vue.js"></script>

<script>
    let vm = new Vue({
        el: '#app',
        data: {
            name: "bob",
            num: 100,
            data_list: [1,2,3],
            info: {weather: "cloud", sky: "blue"},
            str_words: "love"
        }

    })
</script>

</html>

通过vm对象获取vue的属性

vm.$el;  // 获取vue对象
vm.$data;  // 获取vue里面的属性
vm.$data.hobby_list;  // 获取vue里面的属性里面的对象

3. vue指令系统:  指令系统="值"

文本操作: v-text, v-html

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

<div id="app">
    <p>{{ aele }}</p>  <!-- <a href="">百度</a> -->
    <p v-text="aele"></p>  <!-- <a href="">百度</a> -->
    <p v-html="aele"></p>  <!-- 百度 -->
    <p v-html="name"></p>  <!-- bob -->
</div>

</body>

<script src="vue.js"></script>

<script>
    let vm = new Vue({
        el: '#app',
        data: {
            aele:'<a href="">百度</a>',
            name: 'bob',
        }
    })

</script>
</html>

条件渲染:  v-if 和 v-show

v-if 控制标签生成或者去除的
v-show 控制标签显示或者隐藏的
频繁切换标签显示与否,尽量使用v-show,不会重组文档结构,那么切换起来效率高
不频繁的可以用v-if,条件不成立,不会生成标签,渲染就快一些

示例

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

<div id="app">
    <h1 v-if="num<100">{{ name }}</h1>
    <h2 v-else-if="num>100">帅吗?</h2>
    <h3 v-else="num=100">你真帅</h3>

    <h4 v-show="num=100">{{ str_words }}</h4>

</div>

</body>

<script src="vue.js"></script>

<script>
    let vm = new Vue({
        el: '#app',
        data: {
            name: 'bob',
            num: 100,
            str_words: "love"
        }
    })

</script>
</html>

4. 属性绑定 v-bind,  v-on,  v-model:  动态属性

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

<div id="app">
    <h1 aa="name"></h1>  <!-- 静态属性 -->
    <h1 v-bind:aa="name"></h1>  <!-- 动态属性 -->
    <h1 :aa="name"></h1>  <!-- 简写形式 -->

    <h1 v-on:click="num++">点击</h1>
    <h1 @click="num++">再点击</h1>  <!-- 点击事件, 点击一次,num值加一个 -->
    {{ num }}

    <br>

    <button @click="num++">+</button>
    <input type="text" v-model="num">  <!-- 双向数据绑定, 在输入框里修改数据也可以 -->
    <button @click="num--">-</button>
    {{ num }}

</div>

</body>

<script src="vue.js"></script>

<script>
    let vm = new Vue({
        el: '#app',
        data(){   // 这样写数据属性是最常用的方式,因为后面学和使用组件的功能时,必须要这样写数据属性
            return{
                name: 'bob',
            num: 100,
            str_words: "love"
            }
    }
    })

</script>
</html>

5. methods属性: 可以在里面写一些函数逻辑

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

<div id="app">

    <button @click="num++">+</button>
    <input type="text" v-model="num">  <!-- 双向数据绑定, 在输入框里修改数据也可以 -->
    <button @click="Handler">-</button>  <!-- 这样数字修改就不会为负数了 -->
    {{ num }}

</div>

</body>

<script src="vue.js"></script>

<script>
    let vm = new Vue({
        el: '#app',
        data(){   // 这样写数据属性是最常用的方式,因为后面学和使用组件的功能时,必须要这样写数据属性
            return{
                name: 'bob',
            num: 100,
            str_words: "love"
            }
    },
        methods: {
            Handler() {
                if(this.num>=1){
                    this.num--
                }
            }
        }
    })

</script>
</html>

小示例: 显示和隐藏密码

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

<div id="app">
    <input :type="type"> <button @click="show">{{text_str}}</button>
</div>
</body>
<script src="vue.js"></script>
<script>
    new Vue({
        el:'#app',
        data(){
            return {
                type: "password",
                text_str: "显示密码"
            }
        },
        methods:{
            show(){
                if (this.type === "password"){
                    this.type='text';
                    this.text_str="显示密码"
                }else {
                    this.type='password';
                    this.text_str="隐藏密码"
                }
            }
        }
    })
</script>
</html>

6. class类值操作

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .c1 {
            color: red;
        }
        .c2 {
            background-color: #00c4ff;
        }
    </style>
</head>
<body>

<div id="app">

    <div :class="{c1:status, c2: num===10}">天气很热</div>  <!-- 形式一 -->
    <hr>
    <div :class="status?'c1':'c2'">秋天到了</div>  <!-- 形式二 -->
    <hr>
    <div :class="[m1, m2]">冬天也有</div>  <!-- 数组形式 -->
    <button @click="status=!status">改变样式</button>

</div>
</body>
<script src="vue.js"></script>
<script>
    new Vue({
        el:'#app',
        data(){
            return {
                status: false,
                num: 10,
                m1: {"c1": true},
                m2: {"c2": false}
            }
        },
        methods:{
        }
    })
</script>
</html>

css样式操作: 三种方式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .c1 {
            color: red;
        }
        .c2 {
            background-color: #00c4ff;
        }
    </style>
</head>
<body>

<div id="app">

    <div :style="{backgroundColor:bgc, fontSize: xfont}">天气很热</div>
    <hr>
    <div :style="ss">秋天到了</div>
    <hr>
    <div :style="[ss,cc]">冬天也有</div>  <!-- 数组形式 -->
    <button @click="">改变样式</button>

</div>
</body>
<script src="vue.js"></script>
<script>
    new Vue({
        el:'#app',
        data(){
            return {
                bgc: 'pink',
                xfont: '30px',
                ss: {
                    backgroundColor: 'greenyellow',
                    color: 'white',
                },
                cc: {
                    fontSize: '50px'
                }
            }
        },
        methods:{
        }
    })
</script>
</html>

选项卡示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #card {
            width: 500px;
            height: 350px;
        }

        .title {
            height: 50px;
        }

        .title span {
            width: 100px;
            height: 50px;
            background-color: #ccc;
            display: inline-block;
            line-height: 50px; /* 设置行和当前元素的高度相等,就可以让文本内容上下居中 */
            text-align: center;
        }

        .content .list {
            width: 500px;
            height: 300px;
            background-color: yellow;
            display: none;
        }

        .content .active {
            display: block;
        }

        .title .current {
            background-color: yellow;
        }
    </style>
    <script src="vue.js"></script>
</head>
<body>

<div id="card">
    <div class="title">
        <span :class="{current:num===1}" @click="num=1">国内新闻</span>
        <span :class="{current:num===2}" @click="num=2">国际新闻</span>
        <span :class="{current:num===3}" @click="num=3">银河新闻</span>
        <!--<span>{{num}}</span>-->
    </div>
    <div class="content">
        <div class="list" :class="{active:num===1}">国内新闻列表</div>
        <div class="list" :class="{active:num===2}">国际新闻列表</div>
        <div class="list" :class="{active:num===3}">银河新闻列表</div>
    </div>
</div>
<script src="vue.js"></script>
<script>
    // 思路:
    // 当用户点击标题栏的按钮[span]时,显示对应索引下标的内容块[.list]
    // 代码实现:
    var card = new Vue({
        el: "#card",
        data: {
            num: 0,
        },
    });
</script>

</body>
</html>

7. v-for循环指令系统

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
    <ul>
        <li :key="value.id" v-for="(value, index) in data_list">{{value.name}}--{{index}}</li>
        <li v-for="(value, index) in info">{{ value }}--{{ index }}</li>

    </ul>
    <!--
     bob--0
    bob2--1
    bob3--2
    111--username
    222--age
     -->

</div>

</body>
<script src="vue.js"></script>
<script>
    let vm = new Vue({
        el: '#app',
        data(){
            return {
                data_list:[
                    {id: 1, name: "bob", age: 17},
                    {id: 2, name: "bob2", age: 18},
                    {id: 3, name: "bob3", age: 19},
                ],
                info: {
                    username: 111,age: 222
                }
            }
        }
    })

</script>

</html>

8. 全局和局部过滤器和计算属性

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

<div id="app">
<h1>{{ name|aa }}</h1>
    <h1>{{ name|bb }}</h1>
    <h1>{{ "一元商品"|cc }}</h1>
    <h1>{{ dd }}</h1>  <!-- 直接写计算属性的函数名 -->

</div>
</body>
<script src="vue.js"></script>

<script>
    // 定义全局过滤器
    Vue.filter("aa", function (val) {
        return val+"真好看"
    })

    let vm = new Vue({
        el: "#app",
        data(){
            return{
                name: "666",
                name2: "888",
            }
        },
        // 定义局部过滤器
        filters: {
            "bb": function (val) {
                if(val==="666"){
                    return 520
                }
            },
            "cc"(val){
                return val+"促销大放送"
            }
        },
        // 计算属性
        computed: {
            "dd": function () {
                let s1 = this.name + 111 + this.name2
                return s1
            }
        }

    })
</script>
</html>

9. 阻止事件冒泡:  @click.stop.prevent

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .c1 {
            width: 100px;
            height: 100px;
            background-color: #00c4ff;
        }
        .c2 {
            width: 50px;
            height: 50px;
            background-color: #5A5CAD;
        }
    </style>
</head>
<body>
<div id="app">

    <div class="c1" @click="fatherHandler">
        <div class="c2" @click.stop="sonHandler"></div>  <!-- 阻止时间冒泡 -->
        <!-- <div class="c2" @click.stop.prevent="sonHandler"> 这种形式也可以 -->
    </div>

    <!-- 阻止页面刷新 -->
    <form action="">
        <input type="text">
        <input type="submit" @click.stop.prevent=""> <!-- 阻止submit按钮提交数据的动作 -->
    </form>

    <a href="" @click.stop.prevent="">百度</a>

</div>

</body>
<script src="vue.js"></script>
<script>
    let vm = new Vue({
        el: '#app',
        data(){
            return {

            }
        },
        methods: {
            fatherHandler(){
                alert("father")
            },
            sonHandler(){
                alert("son")
            }
        }
    })

</script>

</html>

10. 生命周期钩子函数

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

<div id="app">
    {{ name }}
    {{ num }}
</div>

</body>
<script src="vue.js"></script>
<script>
    let vm = new Vue({
        el: '#app',
        data(){
            return{
                name: "bob",
                num: 100,
            }
        },
        // 加载数据之前执行
        beforeCreate: function () {
        console.log(this.el);  // undefined
        console.log(this.$data)  // undefined
        },
         // vue对象加载数据属性之后,执行,比较常用
        created: function () {
            console.log(this.el);  // undefined
            console.log(this.$data)  // name: "bob"
            // 这里就可以发请求,在加载页面时获取后台的数据来展示
        },
        // 数据属性已经有值了,将数据挂载到视图中之前触发
        beforeMount: function () {
            console.log(this.el);  // undefined
            console.log(this.$data)  // 数据
        },
        // 数据挂载到对应视图中之后,触发
        mounted: function () {
            console.log(this.el);  // undefined
            console.log(this.$data)  // 数据
        },
         // 某个视图发生变化之前触发,之后触发, 不然不会触发
        beforeUpdate: function () {
            console.log(this.el);
            console.log(this.$data)
        },
        updated: function () {
            console.log(this.el);
            console.log(this.$data)
        }
    })
</script>
</html>

11. 监听属性: watch

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
    <button @click="info.name='jack'">{{ info.name }}</button>
    <input type="text" v-model="str_text">
</div>

</body>
<script src="vue.js"></script>
<script>
    let vm = new Vue({
        el: '#app',
        data(){
            return{
                info: {name: "bob", age: 18},
                str_text: "love",
            }
        },
        watch:{
            // 想监听哪个值的变化, 就以这个值作为函数名称, 注意, 如果里面有.的话, 要用引号引起来
            'info.name':function (val) {
                console.log(val)
            },
            // 监听用户输入
            str_text: function (val) {
                console.log(val)
            }
        }
    })
</script>

</html>
原文地址:https://www.cnblogs.com/fdsimin/p/13568692.html