Vue 快速入门

151 阅读5分钟

简介

Vue 是一款用于构建用户界面渐进式的 JavaScript 框架。(官方:htttps://cn.vuejs.org/)

快速上手

VSCode 创建一个文件 01快速入门.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <h1>{{msg}}</h1>
    </div>


    <!-- 引入vue模块 -->
    <script type="module">
        import { createApp} from 'https://cdn.jsdelivr.net/npm/vue@next/dist/vue.esm-browser.js'
        // 创建vue的应用实例
        createApp({
            data() {
                return {
                    //定义数据
                    msg: 'hello vue3'
                }
            }
        }).mount("#app");
    </script>
</body>
</html>

常用指令

指令:HTML标签上带有 v- 前缀的特殊属性,不同的指令具有不同的含义,可以实现不同的功能

常用指令:

指令作用
v-for列表渲染,遍历容器的元素或者对象的属性
v-bind为HTML标签绑定属性值,如设置 href,css样式等
v-if/v-else-if/v-else条件性的渲染某元素,判定为true时渲染,否则不渲染
v-show根据条件展示某元素,区别在于切换的是display属性的值
v-model在表单元素上创建双向数据绑定
v-on为HTML标签绑定事件

v-for

语法:v-for = "(shop,index) in shops"

参数说明:

  • shops 为遍历的数组
  • shop 为遍历出来的元素
  • index 为索引/下标,从0开始;可以省略,省略index语法:v-for = "shop in shops"

VSCode 创建一个文件 02指令v-for.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <div id="app">
        <table border="1 solid" colspan="0" cellspacing="0">
            <tr>
                <th>文章标题</th>
                <th>分类</th>
                <th>发表时间</th>
                <th>状态</th>
                <th>操作</th>
            </tr>
            <tr v-for="article in articleList" :key="article.title">
                <td>{{ article.title }}</td>
                <td>{{ article.category }}</td>
                <td>{{ article.time }}</td>
                <td>{{ article.state }}</td>
                <td>
                    <button>编辑</button>
                    <button>删除</button>
                </td>
            </tr>
        </table>
    </div>

    <script type="module">
        import { createApp} from 'https://cdn.jsdelivr.net/npm/vue@next/dist/vue.esm-browser.js'
        // 创建应用实例
        createApp({
            data() {
                return {
                    articleList: [
                        {
                            title: "医疗反腐绝非砍医护收入",
                            category: "时事",
                            time: "2023-09-05",
                            state: "已发布"
                        },
                        {
                            title: "中国男篮缘何一败涂地?",
                            category: "篮球",
                            time: "2023-09-05",
                            state: "草稿"
                        },
                        {
                            title: "华山景区已受大风影响阵风达 7-8 级,未来 24 小时将持续",
                            category: "旅游",
                            time: "2023-09-05",
                            state: "已发布"
                        }
                    ]
                };
            }
        }).mount("#app");
    </script>
</body>
</html>

注意:遍历的数组,必须在data中定义;要想让哪个标签循环展示多次,就在哪个标签上使用 v-for 指令

v-bin

语法:v-bind:属性名=“属性值 | 简化::属性名=“属性值”

VSCode 创建一个文件 03指令v-bind.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <!-- <a v-bind:href="url">百度一下</a> -->
        <a :href="url">百度一下</a>
    </div>

    <script type="module">
        //引入vue模块
        import { createApp} from 
                'https://cdn.jsdelivr.net/npm/vue@next/dist/vue.esm-browser.js'
        //创建vue应用实例
        createApp({
            data() {
                return {
                    url: 'https://www.baidu.com'
                }
            }
        }).mount("#app")//控制html元素
    </script>
</body>
</html>

注意:v-bind所绑定的数据,必须在data中定义

v-if & v-show

  • v-if

  • 语法:v-if = "表达式",表达式值为 true,显示;flase,隐藏

  • 其它:可以配合 v-else-if / v-else 进行链式调用条件判断

  • 原理:基于条件判断,来控制创建或移除元素节点(条件渲染)

  • 场景:要么显示,要么不显示,不频繁切换的场景

  • v-show

  • 语法:v-show="表达式",表达式为 true,显示;false,隐藏

  • 原理:基于CSS样式display来控制显示与隐藏

  • 场景:频繁切换显示隐藏的场景

VSCode 创建一个文件 04指令v-if&v-show.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">

        商品价格为:  <span v-if="customer.level >= 0 && customer.level <= 1">9.9</span>
                    <span v-else-if="customer.level >= 2 && customer.level <= 4">19.9</span>
                    <span v-else>29.9</span>
        
        <br>            
        商品价格为:  <span v-show="customer.level >= 0 && customer.level <= 1">9.9</span>
                    <span v-show="customer.level >= 2 && customer.level <= 4">19.9</span>
                    <span v-show="customer.level >= 5">29.9</span>

    </div>

    <script type="module">
        //导入vue模块
        import { createApp } from 'https://cdn.jsdelivr.net/npm/vue@next/dist/vue.esm-browser.js'

        //创建vue应用实例
        createApp({
            data() {
                return {
                    customer: {
                        name: '张三',
                        level: 1
                    }
                }
            }
        }).mount("#app")//控制html元素
    </script>
</body>

</html>

v-on

语法:v-on:事件名 = "函数名" | 简写:@事件名="函数名"

VSCode 创建一个文件 05指令v-on.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <button v-on:click="xiao"></button> &nbsp;
        <button @click="ku"></button>
    </div>

    <script type="module">
        //导入vue模块S
        import { createApp} from 'https://cdn.jsdelivr.net/npm/vue@next/dist/vue.esm-browser.js'

        //创建vue应用实例
        createApp({
            data() {
                return {
                    //定义数据
                }
            },
            methods:{
                xiao: function(){
                    alert('哈哈哈哈')
                },
                ku: function() {
                    alert('呜呜呜呜')
                }
            }
        }).mount("#app");//控制html元素

    </script>
</body>
</html>

v-model

语法:v-model = "变量名"

VSCode 创建一个文件 06指令v-model.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">

        文章分类: <input type="text" v-model="searchConditions.category"/> <span> {{searchConditions.category}} </span>

        发布状态: <input type="text" v-model="searchConditions.state"/> <span> {{searchConditions.state}} </span>

        <button>搜索</button>
        <button v-on:click="clear">重置</button>

        <br />
        <br />
        <table border="1 solid" colspa="0" cellspacing="0">
            <tr>
                <th>文章标题</th>
                <th>分类</th>
                <th>发表时间</th>
                <th>状态</th>
                <th>操作</th>
            </tr>
            <tr v-for="(article,index) in articleList">
                <td>{{article.title}}</td>
                <td>{{article.category}}</td>
                <td>{{article.time}}</td>
                <td>{{article.state}}</td>
                <td>
                    <button>编辑</button>
                    <button>删除</button>
                </td>
            </tr>
        </table>
    </div>
    <script type="module">
        //导入vue模块
        import { createApp } from 'https://cdn.jsdelivr.net/npm/vue@next/dist/vue.esm-browser.js'
        //创建vue应用实例
        createApp({
            data() {
                return {
                    //定义数据
                    searchConditions:{
                        category: '',
                        state: ''
                    },
                    articleList: [{
                        title: "医疗反腐绝非砍医护收入",
                        category: "时事",
                        time: "2023-09-5",
                        state: "已发布"
                    },
                    {
                        title: "中国男篮缘何一败涂地?",
                        category: "篮球",
                        time: "2023-09-5",
                        state: "草稿"
                    },
                    {
                        title: "华山景区已受大风影响阵风达7-8级,未来24小时将持续",
                        category: "旅游",
                        time: "2023-09-5",
                        state: "已发布"
                    }]
                }
            },
            methods:{
                clear: function(){
                    //清空category以及state的数据
                    //在methods对应的方法里面,使用this就代表vue实例,可以使用this获取到vue实例中的数据
                    this.searchConditions.category = '';
                    this.searchConditions.state = '';
                }
            }

        }).mount("#app")//控制html元素
    </script>
</body>

</html>

注意:v-model 中绑定的变量,必须在data中定义

生命周期

生命周期:指一个对象从创建到销毁的整个过程

应用场景:在页面加载完毕时,发起异步请求,加载数据,渲染页面

生命周期的八个阶段:每个阶段会自动执行一个生命周期方法(钩子),让开发者有机会在特定的阶段执行字节的代码

状态阶段周期
beforeCreate创建前
created创建后
beforeMount载入前
mounted挂载完成
beforeUpdate数据更新前
updated数据更新后
beforeUnmount组件销毁前
unmounted组件销毁后

Axios

介绍:Axios 对原生的 Ajax 进行了封装,简化书写,快速开发

官网:www.axios-http.cn/

Axios 使用步骤:

  • 引入Axios的js文件(参考官网)
  • 使用Axios发送请求,并获取相应结果

样例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 引入axios的js文件 -->
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script>
        //发送请求
        axios({
            method: 'GET',
            url: 'https://mock.apifox.cn/m1/3083103-0-default/emps/list'
        }).then((result=>{
            //成功的回调
            //restful代表服务器响应的所有的数据,包含了响应头,响应体. result.data 代表的是响应的核心数据
            console.log(result.data);
        }).catch(err=>{
            //失败的回调
            console.log(err);
        }));

        let test={
            test: 'test'
        }

        axios({
            method: 'POST',
            url: 'https://mock.apifox.cn/m1/3083103-0-default/emps/list',
            data: test
        }).then((result=>{
            //成功的回调
            //restful代表服务器响应的所有的数据,包含了响应头,响应体. result.data 代表的是响应的核心数据
            console.log(result.data);
        }).catch(err=>{
            //失败的回调
            console.log(err);
        }));

        //别名的方式发送请求
        axios.get("https://mock.apifox.cn/m1/3083103-0-default/emps/list").then((result=>{
            //成功的回调
            //restful代表服务器响应的所有的数据,包含了响应头,响应体. result.data 代表的是响应的核心数据
            console.log(result.data);
        }).catch(err=>{
            //失败的回调
            console.log(err);
        }));

        axios.post("https://mock.apifox.cn/m1/3083103-0-default/emps/list",test).then((result=>{
            //成功的回调
            //restful代表服务器响应的所有的数据,包含了响应头,响应体. result.data 代表的是响应的核心数据
            console.log(result.data);
        }).catch(err=>{
            //失败的回调
            console.log(err);
        }));
    </script>
</body>
</html>