• 作者:老汪软件技巧
  • 发表时间:2024-10-07 00:02
  • 浏览量:

VUE 概述

本文意在快速上手vue,内部细节一概不管,主打能用会用,能出活。

引入 VUE

可以把vue理解成一个别人写的一串代码,可以直接下载引入,也可以通过工程化,npm引入。

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

具体参考“如何创建一个vue项目”

快速入门

直接引入

html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>初识Vuetitle>
    
    <script src="./js/vue.js">script>
head>
<body>
    
    <div id="root">
        <h1>Hello,{{name}}!h1>
    div>
    <script>
        //Step1: 设置Vue全局配置,并创建Vue对象
        new Vue({
            //vStep1: 让容器和Vue建立联系。
            // 使用el指定当前Vue示例为哪个容器服务,值通常是CSS选择器字符串
            el: '#root',
            
            // Step2: 进行数据绑定。
            data: {
                name: 'Vue'
            }
        });
    script>
body>
html>

总结:

想让 Vue 工作,就必须创建一个 Vue 实例,且要传入一个配置对象;root 容器里的代码依然符合 html 规范,只不过混入了一些特殊的 Vue 语法;root 容器里的代码被称为【Vue模板】;Vue 实例和容器是一一对应的;真实开发中只有一个Vue实例,并且会配合着组件一起使用;{{ xxx }} 中的 xxx 要写 js 表达式,且 xxx 可以自动读取到 data 中的所有属性;一旦 data 中的数据发生改变,那么页面中用到该数据的地方也会自动更新;

注意区分:js 表达式 和 js 代码(语句)

js 代码(语句)

js表达式是js代码的子集,它属于特殊的js代码

模板语法

Vue 的模板语法分为插值语法和指令语法,就是把 DOM 数据和实例数据联系起来

插值语法:{{JS表达式}}

作用:用于解析标签体内容

<div id="root">
    <h1>hello,{{name}}h1>
div>

<script src="./js/vue.js">script>
<script>
    new Vue({
        el: '#root',
        data: {
            name: 'Vue'
        }
    });
script>

指令语法:v-xxx:

作用:用于解析标签(解析标签属性、解析标签体内容、绑定事件……)

<div id="root">
    <a v-bind:href="url">点击跳转至百度1a>
    
    <a :href="url">点击跳转至百度2a>
div>

<script src="./js/vue.js">script>
<script>
    new Vue({
        el: '#root',
        data: {
            url: 'http://www.baidu.com'
        }
    });
script>

总结:

Vue模板语法有2大类:1.插值语法:功能:用于解析标签体内容。写法:{{xxx}},xxx是js表达式,且可以直接读取到data中的所有属性。2.指令语法:功能:用于解析标签(包括:标签属性、标签体内容、绑定事件…)。举例:v-bind:href=“xxx” 或 简写为 :href=“xxx”,xxx同样要写js表达式,且可以直接读取到data中的所有属性。备注:Vue中有很多的指令,且形式都是:v-???,此处我们只是拿v-bind举个例子。

⭐重点⭐

其实我一直在想,有没有什么办法可以就是说,三言两语解决基础的内容,让人快速上手,我想了想这样不OK,就拿这个模板语法来说,如果不知道getelementbyid,你就不知道VUE的数据DOM分离,你也就不理解它是什么,为什么,怎么样。所以我以后文章方向还是要把基础打扎实。

数据绑定

html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>数据绑定title>
    
    <script src="./xxxxxx/vue.js">script>
head>
<body>
    <div id="root">
        单向绑定数据: <input type="text" v-bind:value="value1"> <br> 
        双向绑定数据: <input type="text" v-model:value="value2">
        
    div>
    <script>
        new Vue({
            el: '#root',
            data: {
                value1: '单向数据绑定',
                value2: '双向数据绑定'
            }
        });
    script>
body>
html>

总结:

Vue中有2种数据绑定的方式:1.单向绑定(v-bind):数据只能从data流向页面。2.双向绑定(v-model):数据不仅能从data流向页面,还可以从页面流向data。备注:1.双向绑定一般都应用在表单类元素上(如:input、select等)2.v-model:value 可以简写为 v-model,因为v-model默认收集的就是value值。

数据劫持

一般用不到

事件处理

事件处理需要用到v-on指令,同时还需要搭配methos一起使用

1.通过点击事件修改h1中的值

html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>事件处理1title>
    
    <script src="./js/vue.js">script>
head>
<div id="root">
    <h1>{{name}}h1>
    <button v-on:click="changeName()">点我更换名字button>
div>
<body>
    <script>
        const vm = new Vue({
            el: '#root',
            data: {
                name: '张三'
            },
            methods: {
                changeName(e) {
                    console.log(this); //此处的this代表vm
                    console.log(e.target); //
                    vm.name = "李四";
                }
            }
        });
    script>
body>
html>

2.事件修饰计算属性

方式一:直接使用插件表达式实现

备注:这里的例子过于简单,其实直接使用插件表达式也是没毛病的,但如果在实际开发中遇到需要在插件表达式中进行大量函数调用时,建议使用计算属性

html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>计算属性1title>
    
    <script src="./js/vue.js">script>
head>
<body>
    <div id="root">
        姓: <input type="text" v-model="firstName"> <br>
        名: <input type="text" v-model="secondName"> <br>
        
        全名:<span>{{firstName.slice(0,3)}}-{{secondName}}span>
    div>
body>
<script>
    const vm = new Vue({
        el:'#root',
        data:{
        	firstName:'张',
        	secondName:'三'
        }
    })
script>
html>

方式二:使用methods进行实现

html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>计算属性2title>
    
    <script src="./js/vue.js">script>
head>
<body>
    <div id="root">
        姓: <input type="text" v-model="firstName"> <br> 
        名: <input type="text" v-model="secondName"> <br>
        
        全名:<span>{{fullName()}}span>
    div>
body>
<script>
    const vm = new Vue({
        el: '#root',
        data: {
            firstName: '张',
            secondName: '三'
        },
        methods: {
            //当firstName或secondName发生改变时,fullName函数就会被调用
            fullName() {
                return this.firstName.slice(0, 3) + '-' + this.secondName;
            }
        }
    })
script>
html>

方式三:使用计算属性实现

备注:计算属性底层也是使用数据劫持实现的,需要注意的是计算属性属于Vue对象(可以直接通过Vue调用),但不属于_data

html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>计算属性3title>
    
    <script src="./js/vue.js">script>
head>
<body>
    <div id="root">
        姓: <input type="text" v-model="firstName"> <br> 
        名: <input type="text" v-model="secondName"> <br> 
        全名:<span>{{fullName}}span>
    div>
body>
<script>
    Vue.config.productionTip = false;
    const vm = new Vue({
        el: '#root',
        data: {
            firstName: '张',
            secondName: '三'
        },
        computed: {
            fullName: {
                //get的调用时机:1)初次调用,get被调用 2)所依赖的data数据发生改变时get被调用(不改变就直接使用缓存) 
                get() { 
                    // console.log(this);//此处的this是Vue
                    return this.firstName + '-' + this.secondName;
                },
                //set方法,用于对fullName这个计算属性进行修改 
                set(value) {
                    console.log("set方法被调用了");
                    const arr = value.split("-");
                    this.firstName = arr[0];
                    this.secondName = arr[1];
                }
            }
        }
    });
script>
html>

知识拓展

总结

计算属性:1.定义:要用的属性不存在,要通过已有属性计算得来。2.原理:底层借助了Objcet.defineproperty方法提供的getter和setter。3.get函数什么时候执行?(1).初次读取时会执行一次。(2).当依赖的数据发生改变时会被再次调用。4.优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便。5.备注:1.计算属性最终会出现在vm上,直接读取使用即可。2.如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变。

侦听器watch

html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>监视属性2title>
    
    <script src="./js/vue.js">script>
head>
<body>
    <div id="root">
        <h2>天气很{{info}}h2>
        <button @click="changeWeather()">切换天气button>
    div>
    <script>
        Vue.config.productionTip = false;
        const vm = new Vue({
            el: '#root',
            data: {
                isHot: true
            },
            computed: {
                info() {
                    return this.isHot ? '热' : '冷';
                }
            },
            methods: {
                changeWeather() {
                    this.isHot = !this.isHot;
                }
            },
            //方式一:
              watch: {
                 isHot: {
                     // 程序初识时就执行handler
                     //(换句话说,就是当我们加上这个属性,保存后就执行handler函数)
                     immediate: true,
                     //当isHot属性发生改变时,handler函数就被调用
                     handler(newValue, oldValue) {
                         console.log(
                             'isHot未修改前:' + oldValue + ';' + 'isHot修改后:' + newValue
                         );
                     }
                 }
             } 
        });
        //方式二:(方式一中的isHot其实也是需要加引号的,只是简写了)
        vm.$watch('isHot', {
            immediate: true,
            handler(newValue, oldValue) {
                console.log('isHot未修改前:' + oldValue + ';' + 'isHot修改后:' + newValue);
            }
        });
    script>
body>
html>

动态绑定样式

意义一般

条件渲染

常用

    <div v-if="n==1">1div>
    <div v-else-if="m==2">2div>
    
    <div>@div>
    <div v-else="n==3">3div>

循环

  <div id="app">
        <ul>
            
            <li v-for="p in persons" :key="p.id">
                {{p.name}}-{{p.age}}
            li>
            
            <li v-for="(p,index) in persons" :key="index">
                {{p}}-{{index}}
            li>
            
            <li v-for="(val,key) in student" :key="key">
                {{val}}-{{key}}
            li>
            
            <li v-for="(number,index) in 3" :key="index">
                {{number}}-{{index}}
            li>
            
            <li v-for="(str,index) in strs" :key="index">
                {{str}}-{{index}}
            li>
        ul>
    div>
body>
<script>
    new Vue({
        el: '#app',
        data: {
            persons: [{
                id: '1',
                name: '张三',
                age: 18
            }, {
                id: '2',
                name: '李四',
                age: 19
            }, {
                id: '3',
                name: '王五',
                age: 20
            }],
            student: {
                name: '张三',
                age: 18,
                gender: '男'
            },
            strs: 'abc'
        }
    });
script>

后记

还有很多,但是要写一个基础的,这就够了,后面我会更新具体的文章

参考资料:/qq_66345100…