jck28 - 小柒 - 前端开发 - Vue基础语法

一,Vue基本介绍

1.1 定义

  • Vue (发音为 /vjuː/,类似 view ) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。

  • 官方文档介绍:简介 | Vue.js

1.2 开发工具安装使用

  • VS Code下载:https://code.visualstudio.com/
  • VS Code安装
    • (1)VS Code安装教程:VScode 教程 | 菜鸟教程
    • (2)安装完成后,推荐下载对应的插件
      • Chinese:汉化包,支持中文
      • “open in browser” :在vscode中支持浏览器打开HTML
      • Live Preview :实时预览编写的代码
        image

二,Vue语法结构

  • 响应式开发是Vue的最大特色,基于“依赖追踪”的方式来实现响应式。

  • createApp函数用来创建Vue实例。

  • setUp函数是组合式api的入口

  • ref函数用来定义响应式变量

  • mount函数用来挂载实例

  • 代码演示

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
<script src="https://cdn.staticfile.net/vue/3.2.36/vue.global.min.js"></script>

<script>
  //导入createApp函数
  const {createApp,ref}= Vue
  //页面加载完成后再来回调执行的代码
  window.onload = function(){
     //创建Vue实例
    const app = createApp({
      //程序入口
      setup(){
        const msg = "Hello Vue !!!!!"
        const num = ref(99)
        const addNum=(app) =>{
          num.value +=1;
        }
        //返回一个对象,用来暴露数据
        return {
          msg,
          num,
          addNum
        }

      }
    })
    //挂载实例
    app.mount("#app")

  }
 
</script>
</head>
<body>
  <div id="app">
    <p>{{msg}}</p>
    <p>{{num}}</p>
    <button @click="addNum">点我</button>
  </div>
</body>
</html>

三,Vue模板语法

  • Vue 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。
  • 文本插值:数据绑定最常见的形式就是使用 {{…}}(双大括号)的文本插值。
  • 支持JavaScript表达式
  • 支持函数调用
  • 指令

四,Vue属性绑定(“v-bind”)

  • v-bind :用于动态绑定属性的指令,可以灵活地修改标签的属性
  • 两种使用方式
<a v-bind:href="url"> ... </a>

<!-- 简写 -->
<a :href="url"> ... </a>
  • 支持绑定单个属性值和多个属性值
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
<script src="vue.js"></script>

<script>
  //导入createApp函数
  const {createApp,ref}= Vue
  //页面加载完成后再来回调执行的代码
  window.onload = function(){
     //创建Vue实例
    createApp({
      //程序入口
      setup(){
        const classNameA = ref("box")
        const classNameB = ref("border")
        const baidu = ref("https://www.baidu.com");
        const bing = ref("https://www.bing.com");
        const readOnlyState = ref(true)
        const size = ref(18)
    //使用响应式变量定义图像的背景色和边框色
        const colorBorder = ref("background-color:red; border:1px solid #000")
        const widthHeight = ref({
          "width" :"100px",
          "height": "100px",
          "margin-top": "120px"
        })
        //返回一个对象,用来暴露数据
        return {
            classNameA,
            classNameB,
            baidu,
            bing,
            readOnlyState,
            size,
            colorBorder,
            widthHeight
        }

      }
    }).mount("#main")
  }
 
</script>
</head>
<body>
  <div id="main">
     <!-- 标准格式属性绑定 -->
    <p v-bind:class="classNameA">{{classNameA}}</p>
     <!-- 简化格式的属性绑定 -->
    <p :class="classNameB">{{classNameB}}</p>
    <!-- 单个属性值绑定 -->
    <P><a v-bind:href="baidu">百度</a></P>
    <p><a :href="bing">必应</a></p>

    <input type="text" value="只读输入框" :readonly="readOnlyState">
    <br>
    <input type="text" :size="size">输入的宽度为{{size}}

    <!-- 绑定多个属性值 -->
    <div>
      <img :style="colorBorder" style="width: 100px;height: 100px;margin-top: 50px;">
    </div>
    <div>
      <img style="background-color: aqua;"  :style="widthHeight">
    </div>
  </div>
</body>
</html>

五,Vue事件绑定(v-on)

  • v-on:用于在 HTML 元素上绑定事件监听器,使其能够触发 Vue 实例中的方法或函数,也支持JS表达式。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
<script src="vue.js"></script>

<script>
    const {createApp, ref} = Vue
    window.onload = function(){
        createApp({
            setup(){
                const numA= ref(0)
                const numB= ref(0)
                const objStyle= ref({
                    "width":"100px",
                    "height":"50px",
                    "margin-top":"10px",
                    "background-color":"yellow",
                    "border":"1px solid black"
                })
                function addA(){
                    numA.value++
                }
                function addB(n){
                    numB.value +=n
                }
                return {
                    numA,
                    numB,
                    objStyle,
                    addA,
                    addB
                }
            }
        }).mount('#app')
    }

</script>

</head>
<body>
    <div id="app">
        <!-- 绑定内联处理器 -->
        <!-- 标准格式 -->
        <button v-on:click="numA++">numA++</button> numA:{{numA}}
        <br>
        <!-- 简化格式 -->
        <button @click="numB++">numB++</button> numB:{{numB}}
        <br>
        <!-- 方法事件处理器 -->
        <button v-on:click="addA">numA++</button> numA:{{numA}}
        <br>
        <button @click="addB(10)">numB++</button> numB:{{numB}}


    </div>
</body>
</html>

六,Vue双向绑定(v-model)

  • v-model:该指令实现表单数据双向绑定
  • 基本用法:
    • 文本绑定(实现单行或多行文本与页面元素的双向绑定,使数据变化也会反应在页面上)
    • 表单控件绑定(将单选,复选框或者选择器的状态绑定到页面元素上,根据所选状态的不同实时改变页面的元素)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
<script src="vue.js"></script>

<script>
    const {createApp, ref}=Vue
    window.onload = function(){
        createApp({
            setup(){
                const oneText = ref("jackRolin")
                const mulText = ref("")
                function clearText(){
                    oneText.value=""
                }
                const checkState = ref()
                // 多选框的情况下,定义为空数组才会多选
                const checkMull = ref([])
                const radioState = ref ()
                const selectState = ref()

                const lazy = ref()
                const number = ref()
                const trim = ref()
                return {
                    oneText,
                    mulText,
                    clearText,
                    checkState,
                    checkMull,
                    radioState,
                    selectState,
                    lazy,
                    number,
                    trim
                }
            }
        }).mount("#app")
    }
</script>

</head>
<body>
<div id="app">
    <p>
        <P>输入的单行文本为:{{oneText}}</P>
        <input type="text" v-model="oneText" placeholder="请输入单行文本">
        <button @click="clearText()">清空</button>
    </p>
    <p>
        <P>输入的多行文本为:{{mulText}}</P>
        <textarea v-model="mulText"></textarea>
    </p>
        <!-- 复选框 -->
    <p>
        <input type="checkbox" v-model="checkState" />
        <label>{{checkState ? "选中状态" :"未选中状态"}}</label>
    </p>
    <!-- 多选框 -->
    <p>
        <p>1,选择喜欢的猫:{{checkMull}}</p>
        <input type="checkbox"  id="bo" value="布偶猫"  v-model="checkMull" />
        <label for="bo">布偶猫</label>
        <input type="checkbox"  id="yd" value="英短"  v-model="checkMull" />
        <label for="yd">英短</label>
        <input type="checkbox"  id="lm" value="蓝猫"  v-model="checkMull" />
        <label for="lm">蓝猫</label>
        <input type="checkbox"  id="xlm" value="暹罗猫"  v-model="checkMull" />
        <label for="xlm">暹罗猫</label>
    </p>
    <!-- 单选框 -->
    <p>
        <p>2,已选择:{{radioState}}</p>
        <input type="radio"  id="A" value="A"  v-model="radioState" />
        <label for="A">A</label>
        <input type="radio"  id="B" value="B"  v-model="radioState" />
        <label for="B">B</label>
        <input type="radio"  id="C" value="C"  v-model="radioState" />
        <label for="C">C</label>
        <input type="radio"  id="D" value="D"  v-model="radioState" />
        <label for="D">D</label>
    </p>
    <!-- 下拉选择器 -->
    <p>
        <p>3,请选择你所在的城市:{{selectState}}</p>
        <select v-model="selectState">
            <option disabled value="" >选择城市</option>
            <option>北京</option>
            <option>上海</option>
            <option>广州</option>
            <option>杭州</option>
        </select>
    </p>

    <div>*********************************************</div>

    <!-- 修饰符 -->
    <!-- .lazy:用于在事件之后同步 -->
    <input type="text" v-model.lazy="lazy" />
    <h2>{{lazy}}</h2>

    <!-- .number:将用户的输入值转换成数值类型 -->
    <!-- typeof:用来返回变量的数值类型 -->
    <input type="text" v-model.number="number" />
    <h2>{{typeof number}}</h2>
    <!-- 。trim:自动过滤用户输入的首部和尾部的空白字符 -->
    <input type="text" v-model.trim="trim" />
    <h2> 空格{{trim}} 空格</h2>

</div>

</body>
</html>

七,Vue条件渲染(v-if)

  • 某些场景下,页面同一个位置需要展示两种或者多种不同的信息结构布局,可以通过vue提供的条件渲染来实现

  • Vue3通过 v-ifv-show 指令来实现

    • v-if:当该条件成立时,则渲染该元素,通过操作DOM元素来进行切换显示
      • 表达式的 值为true时,元素存在DOM树中
      • 表达式的 值为false时,元素从DOM树中移除
    • v-show:是简单控制DOM元素的display属性,渲染HTML元素,符合条件时显示,不符合条件则display显示为none,元素还在DOM树中
  • 代码示例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
<script src="vue.js"></script>

<script>
    const {createApp,ref} = Vue
    window.onload = function(){
        createApp({
            setup(){
                const flag = ref(true)

                const flagChar = ref("A")
                function change(){
                    if(flagChar.value =="A")
                        flagChar.value ="B"
                    else if(flagChar.value =="B")
                        flagChar.value ="C"
                    else if(flagChar.value =="C")
                        flagChar.value ="D"
                    else if(flagChar.value =="D")
                        flagChar.value ="A"
                }
                return {
                    flag,
                    flagChar,
                    change
                }
            }
        }).mount('#app')
    }
</script>

</head>
<body>
    <div id="app">
        <div v-if="flag">
            <h1>v-if 标题</h1>
            <p>内容</p>
            <div>
                <h3>图片</h3>
                <h3>图片</h3>
                <h3>图片</h3>
            </div>
        </div>
        <div v-else>
            <h1>v-else 标题</h1>
            <div>
                <h3>图片</h3>
            </div>
        </div>
        <button @click="flag = !flag" >切换</button>
        <br>

        <div>*************************************</div>

        <div v-show="flag">
            <h1>v-show标题展示</h1>
        </div>

        <div>*************************************</div>

        <div v-if="flagChar=='A'">
            <h1>AAAA</h1>
        </div>
        <div v-else-if="flagChar=='B'">
            <h1>BBBB</h1>
        </div>
        <div v-else-if="flagChar=='C'">
            <h1>CCCC</h1>
        </div>
        <div v-else="flagChar=='D'">
            <h1>DDDD</h1>
        </div>
        <button @click="change()" >切换</button>

    </div>
</body>
</html>

八,Vue列表渲染(v-for)

  • 列表渲染用来对重复结构的元素进行动态生成,提高代码开发效率,减少代码冗余。
  • 列表渲染时推荐绑定一个唯一的值作为:key属性的值,避免出现渲染错误。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
<script src="vue.js"></script>

<script>
    const {createApp, ref}=Vue
    window.onload = function(){
        createApp({
            setup(){
                const data = ref (["Apple", "Banana", "Orange", "Pineapple"])
                const data2 = ref({
                    name:"demi",
                    age:25,
                    gender:"女",
                    city:"深圳"
                })
                const data3 = ref([{ 
                    id:1001,
                    name:"demi",
                    age:25,
                    gender:"female",
                    city:"shenzhen"
                },{ 
                    id:1002,
                    name:"tommy",
                    age:30,
                    gender:"male",
                    city:"beijing"
                },{ 
                    id:1003,
                    name:"sammy",
                    age:21,
                    gender:"female",
                    city:"shanghai"
                },{ 
                    id:1004,
                    name:"tony",
                    age:40,
                    gender:"male",
                    city:"qingdao"
                }])
                function addData(){
                    data3.value.splice(0,0,{
                        id:"1005",
                        name:"saferi",
                        age:19,
                        gender:"male",
                        city:"hangzhou"
                    })
                }
                function changeData(){
                        data3.value[0].name = "kuki",
                        data3.value[2].name = "marina"
                }
                return {
                    data,
                    data2,
                    data3,
                    addData,
                    changeData
                }
            }
        }).mount("#app")
    }

</script>

</head>
<body>
    <div id="app">
        <!-- 数组渲染 -->
        <!-- <div>
            <ul>
                <li v-for="item in data">{{item}}</li>
            </ul>
        </div>
        <hr> -->
        <!-- 带索引的列表渲染 -->
        <!-- <div>
             <p v-for="(item,index) in data">索引下标:{{index}} , 对应的值为:{{item}}</p>
        </div>
        <hr> -->
        <!-- 渲染对象 -->
        <!-- <div v-for="value in data2">{{value}}</div>
        <hr> -->
        <!-- 带属性名渲染对象 -->
        <!-- <div v-for="(value,key) in data2">key:{{key}} —— value:{{value}}</div>
        <hr> -->
        <!-- 带索引渲染对象 -->
        <!-- <div v-for="(value,key,index) in data2">index:{{index}} —— key:{{key}} —— value:{{value}}</div>
        <hr> -->
        <!-- 多层数据列表渲染 -->
        <!-- <div>
            <div v-for="item in data3">
                <h1>{{item.name}}</h1>
                <div>
                    age:<span>{{item.age}}</span> 
                    gender:<span>{{item.gender}}</span>
                    city:<span>{{item.city}}</span>
                </div>
            </div>
        </div> -->
        <!-- 通过key管理状态 -->
        <ul>
            <li v-for="(obj,index) in data3" :key="obj.id">
                <span>
                    第 {{index+1}}条数据:{{obj.id}} - {{obj.name}} - {{obj.age}} - {{obj.gender}} - {{obj.city}}
                </span>
                ---
                <span>
                    <input type="text">
                </span>
            </li>>
        </ul>
        <div>
            <button @click="addData">添加数据</button>  | <button @click="changeData">修改数据</button>
        </div>
    </div>

</body>
</html>

九,Vue计算属性

9.1 computed函数

  • Vue使用computed()在setup中定义计算属性,该函数使用前需要从Vue导入。
  • computed()方法期望接收 一个getter函数,返回值为一个计算属性ref,可以通过属性.value访问计算结果。

9.2 计算属性 Vs 方法的区别

  • 计算属性除了可以简化逻辑之外,最大的优势是基于其响应式依赖的缓存。
  • 一个计算属性仅会在其响应式依赖更新时才会重新计算,只要其依赖的响应式变量不发生改变,无论访问多少次计算属性,都会返回之前缓存的计算结果;而函数在每次调用时都会重新计算。

9.3 可写计算属性

image

  • 代码示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
<script src="vue.js"></script>
<script>
    const {createApp,ref,computed}=Vue
    window.onload = function(){
        createApp({
            setup(){
                const firstname = ref("machael")
                const lastmane = ref("zhang")
                // const fullname = computed(() =>{
                //     return firstname.value + "." + lastmane.value
                // }) 
                    // 可写计算属性
                const fullname = computed({
                    get(){
                        return firstname.value + "." + lastmane.value
                    },
                    set(newValue){
                        [firstname.value, lastmane.value] = newValue.split(".")
                        console.log(firstname.value)
                        console.log(lastmane.value)
                    }
                })
               function changeName(){
                    fullname.value = "meiying.liu"
               }

                return {
                    fullname,
                    changeName
                }
            }
        }).mount("#main")
    }
</script>

</head>
<body>
    <div id="main">
        <p>{{fullname}}</p>
        <button @click="changeName">修改</button>
    </div>
</body>
</html>

十,Vue生命周期

image

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
<script src="vue.js"></script>

<script>
    const {
        createApp,
        ref,
        onBeforeMount,
        onMounted,
        onBeforeUpdate,
        onUpdated,
        onBeforeUnmount,
        onUnmounted
    } = Vue

    window.onload = function(){
        createApp({
            setup(){
                onBeforeMount(() =>{
                    console.log("onBeforeMount:初始化完成后,数据和事件配置之前调用")
                }) 
                onMounted(() =>{
                    console.log("onMounted:初始化完成,实例创建完成后调用")
                })
                 onBeforeUpdate(()=>{
                    console.log("onBeforeUpdate:数据更新,页面渲染之前调用")
                })
                onUpdated(() =>{
                    console.log("onUpdated:数据更新,页面渲染完成后调用")
                })
                onBeforeUnmount(() =>{
                    console.log("onBeforeUnmount:组件实例卸载前调用")
                })
                onUnmounted(() =>{
                    console.log("onUnmounted:组件实例卸载后调用")
                })
                const num = ref(0)
                return {
                    onBeforeMount,
                    onMounted,
                    onBeforeUpdate,
                    onUpdated,
                    onBeforeUnmount,
                    onUnmounted,
                    num
                }
            }
        }).mount('#app')
    }

</script>

</head>
<body>
    <div id="app">
        <p>{{num}}</p>
        <button @click="num++" >修改</button>
    </div>

</body>
</html>