前端框架Vue

Vue

学习路线

在这里插入图片描述

  1. 学习HTML、CSS和JavaScript基础知识:Vue是基于JavaScript的框架,所以首先需要掌握HTML、CSS和JavaScript的基础知识,包括DOM操作、事件处理、变量和函数等。

  2. 学习Vue的基本概念:了解Vue的核心概念,如Vue实例、组件、指令、生命周期等。可以通过官方文档、教程或者在线课程来学习。

  3. 掌握Vue的基本语法:学习Vue的模板语法、指令和数据绑定等基本语法,包括v-bind、v-on、v-if、v-for等常用指令的使用方法。

  4. 学习Vue的组件化开发:Vue是一个组件化的框架,学习如何创建和使用Vue组件,以及组件之间的通信和交互。

  5. 学习Vue的路由和状态管理:学习Vue的路由和状态管理工具,如Vue Router和Vuex,用于实现单页面应用的路由和状态管理。

  6. 实践项目开发:通过实践项目来巩固所学的知识,可以选择一些简单的项目开始,逐渐增加项目的复杂度和功能。

  7. 深入学习Vue的高级特性:学习Vue的高级特性,如自定义指令、混入、插件等,以及Vue的性能优化和调试技巧。

  8. 持续学习和实践:Vue是一个不断发展的框架,持续学习和实践是提高自己的关键。可以通过阅读官方文档、参与社区讨论、参加相关的培训和活动等方式来不断提升自己的Vue技能。

介绍

官方网站:https://cn.vuejs.org/

  • Vue.js是一种用于构建用户界面的开源渐进式JavaScript框架。
  • 它是一种轻量级的框架,易于学习和使用。
  • 它基于标准HTML,CSS和JavaScript构建,并提供了一套声明式的,组件时的编程模型,帮助开发人员高效的开发用户界面。无论简单还是复杂的界面,Vue都可以胜任。
  • Vue.js采用了组件化的开发方式,使得开发者可以将一个页面拆分为多个可复用的组件,从而提高代码的可维护性和复用性。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-377mq144-1688373083288)(E:\VUE笔记\VUE.assets\image-20230630110004514.png)]

特点

  • 响应式:

    • Vue.js使用了双向数据绑定的机制,当数据发生变化时,页面会自动更新,无需手动操作DOM。
  • 组件化:

    • Vue.js将页面拆分为多个组件,每个组件都有自己的逻辑和样式,可以独立开发和维护。
  • 轻量级:

    • Vue.js的体积较小,加载速度快,性能优秀。
  • 简单易用:

    • Vue.js提供了简洁的API和清晰的文档,使得开发者可以快速上手并进行开发。
  • 生态丰富:

    • Vue.js拥有庞大的社区和生态系统,有大量的插件和工具可供选择,方便开发者进行扩展和集成。

渐进式框架

Vue 是一个框架,也是一个生态。其功能覆盖了大部分前端开发常见的需求。但 Web 世界是十分多样化的,不同的开发者在 Web 上构建的东西可能在形式和规模上会有很大的不同。考虑到这一点,Vue 的设计非常注重灵活性和“可以被逐步集成”这个特点。根据你的需求场景,你可以用不同的方式使用 Vue:

  • 无需构建步骤,渐进式增强静态的 HTML
  • 在任何页面中作为 Web Components 嵌入
  • 单页应用 (SPA)
  • 全栈 / 服务端渲染 (SSR)
  • Jamstack / 静态站点生成 (SSG)
  • 开发桌面端、移动端、WebGL,甚至是命令行终端中的界面

无论再怎么灵活,Vue 的核心知识在所有这些用例中都是通用的。即使你现在只是一个初学者,随着你的不断成长,到未来有能力实现更复杂的项目时,这一路上获得的知识依然会适用。如果你已经是一个老手,你可以根据实际场景来选择使用 Vue 的最佳方式,在各种场景下都可以保持同样的开发效率。这就是为什么我们将 Vue 称为“渐进式框架”:它是一个可以与你共同成长、适应你不同需求的框架。

MVVM模式

Vue.js使用MVVM(Model-View-ViewModel)模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mvFMPOAV-1690264748662)(E:\VUE笔记\VUE.assets\image-20230717143837762.png)]

  • Model:数据模型
    • 应用程序的数据,可以从后端获取的数据,也可以是组件自身的数据
  • View:
    • 展示用户界面,即HTML模板部分
  • ViewModel:
    • Vue.js的核心,视图层和数据模型层的中间层,负责建立视图和数据的双向绑定关系

通过MVVM模式,Vue.js实现了数据驱动的开发方式,使开发者能够更专注于业务逻辑的实现,而不用过多关注DOM操作和数据的同步问题。同时,MVVM模式也提高了代码的可维护性和可测试性,使得开发和维护复杂的应用程序更加简单和高效。

搭建Vue开发环境

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-02l5H1fK-1688373083289)(E:\VUE笔记\VUE.assets\image-20230703105459022.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GrMYjRL4-1688373083290)(E:\VUE笔记\VUE.assets\image-20230703105517079.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ag5ZD8C8-1688373083290)(E:\VUE笔记\VUE.assets\image-20230703105537388.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vdHYex5I-1688373083290)(E:\VUE笔记\VUE.assets\image-20230703105653998.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HeKn0Uwx-1688373083291)(E:\VUE笔记\VUE.assets\image-20230703105752548.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dTIWGP9v-1688373083291)(E:\VUE笔记\VUE.assets\image-20230703111030706.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vGdppguX-1688373083292)(E:\VUE笔记\VUE.assets\image-20230703110644806.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jdiaToQE-1688373083292)(E:\VUE笔记\VUE.assets\image-20230703110901721.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NDQXQeqL-1688373083293)(E:\VUE笔记\VUE.assets\image-20230703111014834.png)]

第一个程序

传统的javaScript代码

在Vue.js中,双括号{{}}被用作文本插值的语法,用于在模板中插入动态的数据。

当Vue实例渲染模板时,模板中的{{}}会被替换为实例中对应的数据值。这个过程被称为数据绑定,它建立了视图(View)和模型(Model)之间的联系,使得界面可以随着数据的改变而自动更新。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 第一步,引入Vue -->
    <script type="text/javascript" src="./js/vue.js"></script>

</head>
<body>
    <!-- view层 视图层 -->
    <div id="app">
        <!--
        {{ }}  :  文本插值的语法,用于在模板中插入动态的数据
        {{ }} 会被替换为实例中对应的数据值。这个过程被称为数据绑定,
              它建立了视图(View)和模型(Model)之间的联系,使得界面可以随着数据的改变而更新
        -->
        <h1>我叫:{{ name }}</h1>
        <h1>年龄:{{ age }}</h1>
        <!-- 可以做运算 -->
        <h1>{{ 1 + 2 + 3 }}</h1>
        <!-- 可以做条件判断 -->
        <h1>{{ 3 > 2 }}</h1>
        <h1>{{ 1 > 2 ? '√' : '×'}}</h1>
    </div>

    <!--
        传统的javaScript数据呈现到页面的方式
        对DOM的操作太过繁琐
    -->
    <!--
        <script type="text/javascript">
            var name = "张三";
            var nameValue = document.getElementById("app")
            nameValue.textContent = name;
        </script>
    -->

    <script>
        // 创建一个Vue对象
        var app = new Vue({
            // element的简写,将Vue示例挂载到id为app的元素上
            el: '#app',
            // 数据对象
            // model层 数据模型
            // 用于定义组件的初始数据
            data: {
                // 定义一个message的属性,并赋值为‘Hello World;
                name: '张三',
                age : 18
            }
        })
    </script>
</body>
</html>

Vue常见的属性

  • el
    • 用于指定Vue示例将要挂载到的元素
  • data
    • 用于定义组件的初始数据
  • methods
    • 用于定义组件的方法
  • computed
    • 用于定义计算属性,并在数据变化执行相应的操作
  • watch
    • 用于监听数据的变化,并在数据变化时执行相应的操作
  • props
    • 用于接收父组件传递的数据
  • components
    • 用于注册子组件,使其在父组件中可以使用
  • directives
    • 用于注册自定义指令,可以用于操作DOM 元素
  • filters
    • 用于定义和应用文本格式化的过滤器
  • created
    • 在组件实例被创建后立即调用的钩子函数。
  • mounted
    • 在组件挂载到页面后调用的钩子函数
  • destroyed
    • 在组件被销毁前调用的钩子函数

指令模式

v-bind

用于绑定数据,将Vue实例中的数据绑定到HTML元素的属性上,可以简写为冒号(😃。

例如:v-bind:title=“message”,将Vue实例中的message属性的值绑定到元素的title属性上。

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="./js/vue.js"></script>
</head>
<body>
<div id="app">
	<h1>指令语法:</h1>
    	<a v-bind:href="url">跳转到CSDN</a>
</div>
<script>
    // 创建一个Vue实列
    var app = new Vue({
        // 将Vue示例挂载到id为app的元素上
        el: '#app',
        data: {
            url : 'https://www.csdn.net'
        }
    })
</script>
</body>
</html>

v-model

用于实现双向数据绑定,将表单元素的值与Vue实例中的数据进行双向绑定。

例如:v-model=“message”,将表单元素的值与Vue实例中的message属性进行双向绑定。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-model</title>
    <script type="text/javascript" src="./js/vue.js"></script>
</head>
<body>
<div id="app">
    <h1>v-model指令模式</h1>

    <!--    输入框,使用v-model指令绑定数据-->
    <input type="text" v-model="message" value="请输入">
    <p>{{ message }}</p>

    <input type="checkbox" v-model="isChecked" >
    <label>{{ isChecked ? '检查' : '不检查' }}</label>

    <select v-model="selectedOption">
        <option value=""></option>
        <option value=""></option>
        <option value="rap">rap</option>
    </select>
    <p>选择的选项是: {{ selectedOption }}</p>
</div>

<script>
    var vm = new Vue({
        el: '#app',
        data: {
            message: '',
            isChecked: false,
            selectedOption: ''
        }
    });
</script>
</body>
</html>

v-if / v-else

用于条件渲染,根据表达式的值来决定是否渲染某个元素。

例如:v-if=“isShow”,根据isShow属性的值来决定是否渲染该元素。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-if / v-else指令</title>
    <script type="text/javascript" src="./js/vue.js"></script>
</head>
<body>
<div id="app">
    <h1 v-if="showMessage">Hello, Vue!</h1>
    <h1 v-else>Goodbye, Vue!</h1>
    <button @click="toggleMessage">切换信息</button>
</div>

<script>
    // 创建一个Vue实例
    new Vue({
        // 将Vue实例挂载到id为app的元素上
        el: '#app',
        //数据对象
        data: {
            // 控制是否查看消息的变化
            showMessage: true
        },
        // 方法对象啊
        methods: {
            // 切换消息显示状态的方法
            toggleMessage() {
                //将showMessage的值取反
                this.showMessage = !this.showMessage;
            }
        }
    });
</script>
</body>
</html>

v-for

用于循环渲染,根据数组或对象的内容来生成多个相同的元素。

例如:v-for=“item in items”,根据items数组的内容来生成多个元素。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-for指令</title>
    <script type="text/javascript" src="./js/vue.js"></script>
</head>
<body>
<div id="app">
    <h1>学生列表</h1>
    <ul>
        <!-- 遍历students数组 -->
        <!-- 遍历数组为students,将每一个元素赋值给变量student -->
        <!-- :key属性用于提供唯一的标识符,以便Vue能够跟踪和优化每一个列表项的更新 -->
        <li v-for="student in students" :key="student.id">
            {{student.id}}-{{ student.name }} - {{ student.age }}岁
        </li>
    </ul>
</div>
<script>
    new Vue({
        el: '#app',
        data: {
            students: [
                { id: 1, name: '张三', age: 18 },
                { id: 2, name: '李四', age: 20 },
                { id: 3, name: '王五', age: 22 },
                { id: 4, name: '赵六', age: 19 }
            ]
        }
    })
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-for指令</title>
    <script type="text/javascript" src="./js/vue.js"></script>
</head>
<body>
<div id="app">
    <h1>学生列表</h1>
    <ul>
        <!-- 遍历students数组 -->
        <!--
            students : 要迭代的数组
            student  : 存储数组的元素的变量名
            index    : 迭代到的当前元素索引,从0开始
        -->
        <li v-for="(student,index) in students" :key="student.id">
            {{index}}-{{student.id}}-{{ student.name }} - {{ student.age }}岁
        </li>
    </ul>
</div>
<script>
    new Vue({
        el: '#app',
        data: {
            students: [
                { id: 1, name: '张三', age: 18 },
                { id: 2, name: '李四', age: 20 },
                { id: 3, name: '王五', age: 22 },
                { id: 4, name: '赵六', age: 19 }
            ]
        }
    })
</script>
</body>
</html>

v-once

v-once指令用于只渲染元素和组件一次,并且之后不再进行重新渲染。这意味着元素或组件的初始状态将会保留,而不会受到后续数据变化的修改

使用v-once指令会提高其性能

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-for指令</title>
    <script type="text/javascript" src="./js/vue.js"></script>
</head>
<body>
<div id="app">
    <h1>{{title}}</h1>
    <a v-for="nav in navs" :href="nav.url" v-once>{{nav.name}}</a>
</div>

<script src="https://unpkg.com/vue@next"></script>
<script>
    const vm = Vue.createApp({
        data() {
            return {
                title: 'v-once指令的用法',
                navs: [
                    {name: '首页', url: 'home.html'},
                    {name: '新闻', url: 'news.html'},
                    {name: '视频', url: 'video.html'},
                ]
            }
        }
    }).mount('#app');
</script>
</body>

</html>

v-on

用于绑定事件,将Vue实例中的方法绑定到HTML元素的事件上,可以简写为@。

例如:v-on:click=“handleClick”,将Vue实例中的handleClick方法绑定到元素的click事件上。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-on指令</title>
    <script type="text/javascript" src="./js/vue.js"></script>
</head>
<body>
<div id="app">
    <!-- 显示message变量的值 -->
    <h1>{{ message }}</h1>
    <!-- 点击按钮时调用changeMessage方法 -->
    <button v-on:click="changeMessage">改变信息</button>
</div>


<script>
    new Vue({
        // 将Vue实例挂载到id为app的元素上
        el: '#app',
        data: {
            // 定义一个名为message的变量,初始值为'Hello, Vue!'
            message: 'Hello, Vue!'
        },
        methods: {
            // 定义一个名为changeMessage的方法
            changeMessage: function() {
                // 将message的值改为'New Message!'
                this.message = 'New Message!';
            }
        }
    });
</script>
</body>
</html>

v-show

用于条件显示,根据表达式的值来决定是否显示某个元素,与v-if不同的是,v-show只是通过CSS的display属性来控制元素的显示与隐藏。

例如:v-show=“isShow”,根据isShow属性的值来决定是否显示该元素。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-show指令</title>
    <script type="text/javascript" src="./js/vue.js"></script>
</head>
<body>
<div id="app">
    <!-- 点击按钮时调用toggleShow方法 -->
    <button @click="toggleShow">Toggle Show</button>
    <!-- 根据show的值来决定是否显示该段落 -->
    <p v-show="show">点击按钮时显示这一段</p>
</div>


<script>
    new Vue({
        // 将Vue实例挂载到id为app的元素上
        el: '#app',
        data: {
            // 初始化show的值为false,即不显示该段落
            show: false
        },
        methods: {
            // 定义toggleShow方法
            toggleShow() {
                // 切换show的值,如果为true则变为false,如果为false则变为true
                this.show = !this.show;
            }
        }
    });
</script>
</body>
</html>

组件

Vue组件是Vue.js框架中的核心概念之一,可以应用程序划分为几个独立,可重复的模块。每个组件包含了相关的HTML模板,CSS样式和JavaScript代码,用于构建用户界面。

在Vue中,组件是可复用的自定义元素,通过Vue示例的components选项来注册,一旦注册了组件,就可以在其他的组件和应用程序作用使用。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-show Directive Example</title>
    <script type="text/javascript" src="./js/vue.js"></script>
</head>
<body>
    <div id="app">
        <sin></sin>
    </div>
    <script type="text/javascript">

        /**
         * 全局注册组件:在所有的Vue实例中都可可以使用组件
         * 参数1:组件名称,参数2:具体的组件
         *  Vue.component("sin",{
                template:'<h1>hello!!!</h1>',
            });
         */
            //定义组件
        const countertemp = {
            template: `<button @click='num++'>点击了{{num}}</button>`,
            data(){
                return{
                    num:0
                }
            }
        };

        var vm = new Vue({
            el: "#app",
            //局部组件注册:只能在当前Vue示例中使用
            components:{
                //组件名称:具体组件
                sin: countertemp
            }
        });



    </script>


</body>
</html>

Axios

Axios提供了一种简介且易于使用的方式来处理一步HTTP请求,并自动转换响应数据为JavaScript对象。她支持各种请求方法,例如:GET,POST,PUT,DELETE等,并提供了许多配置选项,例如请求头,发送请求参数,处理错误等。

在Vue中,可以使用Axios来与后端API进行通信,获取数据并更新页面。

在Vue组件中导入Axios,并在需要的地方发起HTTP请求。

官网:https://www.axios-http.cn/

configData.json

{
  "name": "SIN",
  "url": "https://www.baidu.com/",
  "page": 1,
  "method": "get",
  "isNonProfit": true,
  "address": {
    "street": "雁塔区",
    "city": "陕西西安",
    "country": "中国"
  },
  "links": [
    {
      "name": "sin",
      "url": "https://blog.csdn.net/qq_44715376?type=blog"
    }
  ]
}

html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-show Directive Example</title>
    <!-- 导入相关文件-->
    <script type="text/javascript" src="./js/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
    <div id="vue">

    </div>

    <script>
        var vm = new Vue({
            el: '#vue',
            //钩子函数,程序执行的时候插入到Vue的整个生命周期的任意位置执行
            mounted(){
                //get请求
                axios.get('configData.json').then(response=>(console.log(response.data)));
            }
        });
    </script>

</body>
</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Op3eQbm3-1690264809557)(E:\VUE笔记\VUE.assets\image-20230717172938683.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FxPPQTZA-1690264809558)(E:\VUE笔记\VUE.assets\image-20230717172702311.png)]

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Title</title>
    <!-- 导入相关文件-->
    <script type="text/javascript" src="./js/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
    <div id="vue">
        {{info.name}}
        {{info.address}}
        <a v-bind:href="info.url">点击跳转</a>

    </div>

    <script>
        var vm = new Vue({
            el: '#vue',
            data(){
                return{
                    // 请求的返回参数合适,必须喝json字符串一样
                    info: {
                        name: null,
                        url: null,
                        address:{
                            street: null,
                            city: null,
                            country: null
                        },
                        links:[
                            {name: null,
                            url:null
                            }
                        ]
                    }
                }
            },
            //钩子函数,程序执行的时候插入到Vue的整个生命周期的任意位置执行
            mounted(){
                //get请求
                axios.get('configData.json')
                    .then(response=>(this.info=response.data));
            }
        });
    </script>
</body>
</html>

计算属性

Vue计算属性(Computed properties)是一种特殊的计算属性,它们不是组件的data属性,二十依赖于data属性并根据它们计算出来的,计算属性的值会根据所依赖的数据项进行缓存,并在相关数据项发生改变时自动更新。这使得计算属性在性能和代码组织上都有优势,它可以让你用简洁的方式处理复杂的逻辑操作

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Title</title>
    <!-- 导入相关文件-->
    <script type="text/javascript" src="./js/vue.js"></script>
   </head>
<body>
<!-- Vue应用的挂载点,id为"app" -->
<div id="app">
    <!-- 使用v-model指令与Vue实例中的firstName和lastName进行双向数据绑定 -->
    <input type="text" v-model="firstName">
    <input type="text" v-model="lastName">

    <!-- 使用插值表达式直接访问计算属性fullName的值 -->
    <!-- 当firstName或lastName的值发生变化时,fullName的值会自动更新 -->
    <p>Full Name: {{ fullName }}</p>
</div>

<!-- 定义Vue实例 -->
<script>
    new Vue({
        el: '#app',  // Vue实例挂载的元素
        data: {
            firstName: "",  // data中定义的firstName属性
            lastName: ""    // data中定义的lastName属性
        },
        computed: {
            fullName() {
                // 计算属性fullName的值依赖于firstName和lastName的值
                // 当firstName或lastName的值发生改变时,fullName的值会自动更新
                return this.firstName + ' ' + this.lastName;
            }
        }
    });
</script>

</body>
</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P7MWETtt-1690264809558)(E:\VUE笔记\VUE.assets\image-20230718103853771.png)]

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Title</title>
    <!-- 导入相关文件-->
    <script type="text/javascript" src="./js/vue.js"></script>
   </head>
<body>
<!-- Vue应用的挂载点,id为"app" -->
<div id="app">
    <!-- 使用v-model指令与Vue实例中的firstName和lastName进行双向数据绑定 -->
    <input type="text" v-model="num1">+
    <input type="text" v-model="num2">

    <!-- 使用插值表达式直接访问计算属性fullName的值 -->
    <!-- 当firstName或lastName的值发生变化时,fullName的值会自动更新 -->
    <p>sum: {{ sum }}</p>
</div>

<!-- 定义Vue实例 -->
<script>
    new Vue({
        el: '#app',  // Vue实例挂载的元素
        data: {
            num1: "",  // data中定义的firstName属性
            num2: ""    // data中定义的lastName属性
        },
        computed: {
            sum() {
                const n1 = parseFloat(this.num1)||0;
                const n2 = parseFloat(this.num2)||0;
                return n1 + n2;
             }
        }
    });
</script>

</body>
</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0uK7gnMn-1690264809561)(E:\VUE笔记\VUE.assets\image-20230718104203753.png)]

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Title</title>
    <!-- 导入相关文件-->
    <script type="text/javascript" src="./js/vue.js"></script>
   </head>
<body>
    <div id="vue">
        <p>currnetTime1  {{currentTime1()}}</p>
        <p>currentTime2  {{currentTime2}}</p>
    </div>

    <script>
        var vm = new Vue({
            el: "#vue",
            methods:{
                // currentTime1方法
                currentTime1:function () {
                    //返回现在的时间戳
                    return Date.now();
                }
            },
            //计算属性,methods,computed方法名不能重写,重名之后,只会调用Methods的方法
            computed:{
                currentTime2: function () {
                    return Date.now();
                }
            }
        });

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

注意:

​ methods和computed里的东西不能重名

说明:

  • methods:定义方法,调用方法使用currentTime1(),需要带括号
  • cumputed:定义计算属性,调用属性使用currentTime2,不需要带括号

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M2pdGgQO-1690264809562)(E:\VUE笔记\VUE.assets\image-20230718100255985.png)]

插槽Slot

Vue中的插槽(Slot)是一种非常重要的内容分发技术,它允许我们在组件模板中定义一些占位符,然后再使用组件的地方填充这些占位符。

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Title</title>
    <script type="text/javascript" src="./js/vue.js"></script>
</head>

<body>
    <div id="app">
        <todo>
            <!--
                通过slot="todo-title"将其放置在todo组件的todo-title插槽中
                通过:title属性传递一个标题
            -->
            <todo-title slot="todo-title" :title="title"></todo-title>
            <!--
                通过slot="todo-items"将多个列表项放置在todo组件中的todo-itmes插槽中
                通过v-for指令遍历todoItems数组中的每一项
            -->
            <todo-items slot="todo-items" v-for="item in todoItems" :item="item"></todo-items>
        </todo>
    </div>

    <script>
        /**
         * Vue实现简单的列表
         * 包好三个自定义组件todo,todo-title,todo-items。
         *
         */
        Vue.component("todo",{
            template: '<div>\
                            <slot name="todo-title"></slot>\
                                <ul>\
                                    <slot name="todo-items"></slot>\
                                </ul>\
                        </div>'
        });
        /**
         * 列表的标题
         */
        Vue.component("todo-title",{
            props: ['title'],
            template: '<div>{{title}}</div>'
        });
        /**
         * 列表项
         */
        Vue.component("todo-items",{
            props:['item'],
            template: '<li>{{item}}</li>'
        });
        var vm = new Vue({
            el: "#app",
            //定义的数据
            data: {
                title: "你好",
                todoItems: ['张三','李四','王五']
            }
        });



    </script>

</body>

</html>

最终所渲染的结果:

<div id="app">
    <div>
        <div>你好</div>
        <ul>
            <li>张三</li>
            <li>李四</li>
            <li>王五</li>
        </ul>
    </div>
</div>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WkqLw8hb-1690264809563)(E:\VUE笔记\VUE.assets\image-20230718165616844.png)]

总结:

​ 这个简单的列表项,通过使用Vue.js的插槽功能,我们可以将内容分发到响应的插槽中进行指定和重用。

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/83111.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Streamlit项目:基于讯飞星火认知大模型开发Web智能对话应用

文章目录 1 前言2 API获取3 官方文档的调用代码4 Streamlit 网页的搭建4.1 代码及效果展示4.2 Streamlit相关知识点 5 结语 1 前言 科大讯飞公司于2023年8月15日发布了讯飞认知大模型V2.0&#xff0c;这是一款集跨领域知识和语言理解能力于一体的新一代认知智能大模型。前日&a…

Unity 之 变量修饰符public 与private 以及默认

文章目录 publicprivate默认情况的成员变量 public 当在Unity中使用public修饰符时&#xff0c;它将变量声明为公共变量&#xff0c;这意味着该变量可以在Unity编辑器中进行设置&#xff0c;并且可以从其他脚本中访问和修改。公共变量在Unity中广泛用于在脚本之间共享数据&…

快速排序 | C++|时间空间复杂度

1.概念 快速排序(QuickSort)的基本思想是:通过一趟排序将待排记录分割成独立的两部分&#xff0c;其中一部分记录的关键字均比另一部分记录的关键字小&#xff0c;则可分别对这两部分记录继续进行排序&#xff0c;以达到整个序列有序的目的。 2.算法思想描述 1.进行一次划分&…

框架分析(1)-IT人必须会

框架分析&#xff08;1&#xff09;-IT人必须会 专栏介绍当今主流框架前端框架后端框架移动应用框架数据库框架测试框架 Angular关键特点和功能&#xff1a;组件化架构双向数据绑定依赖注入路由功能强大的模板语法测试友好 优缺点分析优点缺点 总结 专栏介绍 link 主要对目前市…

用例图的基本概念及其使用方式(包含案例)

一、引言 用例(Use Case)&#xff0c;是软件工程或系统工程中对系统如何反应外界请求的描述&#xff0c;是一种通过用户的使用场景来获取需求的技术。此概念“用例”的提出者为Ivar Jacobson。每个用例提供了一个或多个场景&#xff0c;该场景说明了系统是如何和最终用户或其它…

Android Studio实现读取本地相册文件并展示

目录 原文链接效果 代码activity_main.xmlMainActivity 原文链接 效果 代码 activity_main.xml 需要有一个按钮和image来展示图片 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk…

亚信科技AntDB数据库连年入选《中国DBMS市场指南》代表厂商

近日&#xff0c;全球权威ICT研究与顾问咨询公司Gartner发布了2023年《Market Guide for DBMS, China》&#xff08;即“中国DBMS市场指南”&#xff09;&#xff0c;该指南从市场份额、技术创新、研发投入等维度对DBMS供应商进行了调研。亚信科技是领先的数智化全栈能力提供商…

Nginx的介绍

本资料转载于传智教育-解锁你的IT职业薪未来&#xff0c;仅用于学习和讨论&#xff0c;如有侵权请联系 视频地址&#xff1a;04-Nginx的优点_哔哩哔哩_bilibili 资源文档&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1RlFl92FdxRUqc858JSxPSQ 提取码&#xff1a;12…

极智嘉x吉利汽车 x京东物流,引领汽车行业智慧物流新变革!

近日&#xff0c;中国领先的汽车制造商吉利汽车携手中国领先的技术驱动的供应链解决方案及物流服务商京东物流、全球仓储机器人引领者极智嘉(Geek)&#xff0c;在西安吉利汽车制造基地RDC仓库率先落地SkyPick上存下拣解决方案&#xff0c;实现了全物流链精益化、智能化、一体化…

热电联产在综合能源系统中的选址定容研究(matlab代码)

目录 1 主要内容 目标函数 程序模型 2 部分代码 3 程序结果 1 主要内容 该程序参考《热电联产在区域综合能源系统中的定容选址研究》&#xff0c;主要针对电热综合能源系统进行优化&#xff0c;确定热电联产机组的位置和容量&#xff0c;程序以33节点电网和17节点热网为例…

70 # 协商缓存的配置:通过修改时间

对比&#xff08;协商&#xff09;缓存 比较一下再去决定是用缓存还是重新获取数据&#xff0c;这样会减少网络请求&#xff0c;提高性能。 对比缓存的工作原理 客户端第一次请求服务器的时候&#xff0c;服务器会把数据进行缓存&#xff0c;同时会生成一个缓存标识符&#…

传统车间VS数字化车间,以MES为核心打造智能工厂!

传统车间的生产制造场景往往存在着信息沟通不顺畅&#xff0c;传达不到位的情况&#xff0c;导致生产效率受影响。 其次车间数据的“缓存期”偏短&#xff0c;无法进行长时间的复盘总结&#xff0c;从而难以发现企业管理问题&#xff0c;无法持续改善。 随着大数据、工业互联…

【大虾送书第六期】搞懂大模型的智能基因,RLHF系统设计关键问答

目录 ✨1、RLHF是什么&#xff1f; ✨2、RLHF适用于哪些任务&#xff1f; ✨3、RLHF和其他构建奖励模型的方法相比有何优劣&#xff1f; ✨4、什么样的人类反馈才是好的反馈 ✨5、RLHF算法有哪些类别&#xff0c;各有什么优缺点&#xff1f; ✨6、RLHF采用人类反馈会带来哪些局…

【UniApp开发小程序】商品详情展示+评论、评论展示、评论点赞+商品收藏【后端基于若依管理系统开发】

文章目录 界面效果界面实现工具js页面日期格式化 后端收藏ControllerServicemapper 评论ControllerServiceMapper 商品Controller 阅读Service 界面效果 【说明】 界面中商品的图片来源于闲鱼&#xff0c;若侵权请联系删除 【商品详情】 【评论】 界面实现 工具js 该工…

【虫洞攻击检测】使用多层神经网络的移动自组织网络中的虫洞攻击检测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Web网页浏览器远程访问jupyter notebook服务器【内网穿透】

文章目录 前言1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5. 固定公网地址 前言 Jupyter Notebook&#xff0c;它是一个交互式的数据科学和计算环境&#xff0c;支持多种编程语言&#xff0c;如…

zotero在不同系统的安装(win/linux)

1 window系统安装 zotero 官网&#xff1a; https://www.zotero.org/ 官方文档 &#xff1a;https://www.zotero.org/support/ (官方)推荐常用的插件: https://www.zotero.org/support/plugins 入门视频推荐&#xff1a; Zotero 文献管理与知识整理最佳实践 点击 exe文件自…

安全学习DAY17_信息打点-语言框架组件识别

信息打点-WEB打点-语言框架&开发组件 文章目录 信息打点-WEB打点-语言框架&开发组件本节涉及链接&工具本节知识&思维导图基础概念介绍框架&#xff1a;组件&#xff1a;Web架构 对应Web测试手法后端&#xff1a;前端组件&#xff1a;java居多&#xff0c;框架&…

物联网在制造业中的应用

制造业目前正在经历第四次工业革命&#xff0c;物联网、人工智能和机器人等技术进步正在推动行业的发展。研究表明&#xff0c;到2024年&#xff0c;全球制造商将在物联网解决方案上投资700亿美元&#xff0c;许多制造商正在实施物联网设备&#xff0c;以利用预测性维护和复杂的…

LeetCode450. 删除二叉搜索树中的节点

450. 删除二叉搜索树中的节点 文章目录 [450. 删除二叉搜索树中的节点](https://leetcode.cn/problems/delete-node-in-a-bst/)一、题目二、题解方法一&#xff1a;递归&#xff08;一种麻烦的方法&#xff09;方法二&#xff1a;优化后的递归 一、题目 给定一个二叉搜索树的根…