Vue.js简介和入门使用

Vue.js是一个由尤雨溪开发的渐进式JavaScript框架,它以数据驱动和组件化为核心。本文介绍了Vue.js的基础知识,包括MVVM思想、数据驱动的概念,以及Vue.js的安装和入门使用,如插值表达式、指令(v-for、v-if、v-bind等)、计算属性和组件化开发思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vuejs 简介

  • Vue.js (vuejs.org)
  • 渐进式 JavaScript 框架
  • vuejs 是基于MVVM 思想的框架
  • vuejs 是以数据驱动为主的框架
  • vuejs 是以组件化进行开发的框架
  • vuejs 是国人尤雨溪(尤大大,尤小石)进行开发的。

什么是渐进式?(vuejs)破坏性小,上手简单

渐进式是相对于另外一种开发思想(侵入式)来说。
渐进式指的是在使用该产品做开发的时候,不需要完全的去重构之前的代码结构,可以非常方便将该产品集成到自身的项目中。

什么是侵入式?(react)脚手架(命令行)封装性明显

侵入式指的是如果要使用这种产品去维护之前的老项目的话,没办法直接引入使用,必须要破坏老项目的结构。
意思就是以前的老项目必须要进行重构,没办法直接使用这种侵入的产品。

什么是 MVVM 开发思想?

MVVM 开发思想是前端近几年借鉴后端的 MVC 的开发思想引进的。

  • M 是 Model 的简写,负责数据,在前端其表现形式就是一个js对象,一般称之为模型变量(数据)

  • V 是 View 的简写,负责数据的展示和收集,在前端的表现形式就是一个 DOM 区域。

  • VM 是 ViewModel 的简写,负责业务逻辑,在前端的表现形式就是当前的产品本身的一个实例对象,它以数据驱动作为指导思想,通过双向数据绑定进行数据的操作。

什么是 MVC 思想?

  • M Model的简写,翻译 模型,负责对数据的操作
  • V View的简写,翻译 视图(模板),负责页面的展示和数据的收集
  • C Controller的简写 翻译 控制器,负责业务逻辑代码

之前做后端的某个功能开发的时候,第一步定义路由(url-----》控制器的方法----》是否调用模型----》是否调用视图----》模板引擎–》响应(HTML页面(前后端不分离 ssr)、json格式(前后端分离 bsr)))

一般把 MVC 这种开发思想也称之为 分层思想。主要是为了便于后期的维护和新功能的扩展。(分而治之)

什么是数据驱动?

数据驱动是相较于传统 web 开发里面的 dom 操作来说的,以前的web开发某个功能的时候,我们都是先进行dom选取,然后在进行业务代码,最后做dom更新。但是其实对开发本身来说,我们不应该关系dom操作,我们只需要去关心我们数据的流向,现在的一些新的框架基于数据流向进行实现,对于开发来说,无须关心底层的dom实现,我们只需要提供数据,框架本身会给我们进行dom操作。这种思想就是数据驱动思想。这种开发思想在目前的各类前端框架,乃至小程序产品里面都有体现。

什么是组件化开发思想?

组件化指的是在开发过程中,把一些可以复用的代码高度的抽象、提取出来,封装成一个一个的代码块,然后在其他的地方进行复用。这种思想叫做组件化。有点类似于乐高积木。并且基于该思想衍生出来非常多的前端的组件化ui库(vantui elementUI mintUI antd iview uview…)

vuejs 入门使用

vuejs 是一个js库,也可以叫做一个框架。

vuejs 目前来说出现过3个版本

  • vuejs 1.x 过时(不使用)
  • vuejs 2.x 大规模使用中(√)
  • vuejs 3.x 新秀 (2020 9 正式发布)
    • 底层架构使用 Proxy api改写
    • 组合api
    • 函数式编程

安装

下载vue.js包

安装 — Vue.js (vuejs.org)

npm

npm install vue

CND

最新版本:

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

稳定版本:

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

使用

入门使用

main.js
只要运行vue项目,main.js就会执行

index.html > mian.js>App.vue

html

<! --1引入vuejs框架-->
<script src="./lib/vue.js"></script>
<script type="text/javascript">
    // 需要编译器
const vm = new Vue({
    el: '#app',// eL是eLement的简写,属性值是一个选择器,选择vuejs,管理的dom区域
    /*data 代表是我们开发中的业务数据*/
	data: {
        title: 'hi vuejs!'
	}
})

</script>
<!--2.需要在html区域定义一个 vuejs管理的dom区域,在该区域内我们可以使用vuejs语法-->
<div id="app">
<! --这个区域会交给vuejs管理插值表达式指令-->
< ! --4.使用的vues语法-->
<!--双大括号一般我们称之为插值表达式”语法,里面可以写vue构造函数 data对象属性里面的哪些属性信息--><h1>{{title}}</h1>
</ div>

在这里插入图片描述

插值表达式
<div id="app">
    <!--这个区域会交给vuejs管理 插值表达式 指令-->
    <!--4. 使用的 vuejs语法-->
    <!--双大括号一般我们称之为 插值表达式 语法,里面可以写Vue构造函数 data对象属性里面的哪些属性信息-->
    <!-- 插值表达式里面到底可以写什么?-->
    <h1>{{ title }}</h1>
    <hr>
    <h2>1. data对象里面的属性</h2>
    <p>{{ version }}</p>
    <hr>
    <h2>2. 四则运算 </h2>
    <p>{{ (1 + 1) + 3 * 4 - 4 }}</p>
    <p>{{ 10 - 1 }}</p>
    <p>{{ 2 * 3 }}</p>
    <p>{{ 20 / 4 }}</p>
    <p>{{ 20 % 3 }}</p>
    <hr>
    <h2>3. 比较运算</h2>
    <p>{{ 10 > 9 }}</p>
    <p>{{ 3 >= 9 }}</p>
    <hr>
    <h2>4. 逻辑运算</h2>
    <p>{{ true && true }}</p>
    <p>{{ true && false }}</p>
    <p>{{ true || false }}</p>
    <p>{{ !false }}</p>
    <p>{{ (10 > 3) && (4 > 0) }}</p>
    <hr>
    <h2> 5. 三目运算 </h2>
    <p>{{ age >= 18 ? '成年': '未成年'}}</p>
    <!--插值表达式里面除了可以写我们的字面量还可以写data对象里的属性,data对象里面的属性的数据类型,就是我们之前js里面的学习的数据类型都可以写-->
    <h2>6. ECMAScript函数使用</h2>
    <p>{{ parseInt( 1.23 ) }}</p>
    <p>{{ Math.random() }}</p>
    <p>{{ '*'.repeat(10) }}</p>
    <hr>
    <h2>7. 用户自定义的全局函数</h2>
    <!--无法使用-->
    <!--<p>{{ sum(1, 2) }}</p>-->
    <hr>
    <h2>8. 业务代码</h2>
    <!--无法使用-->
    <p>
        <!--{{ var number1 = 12; var number2 = 34; }}-->
    </p>
</div>

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

第七点第八点由于是注释了所以不显示,如果不注释页面为空,在页面检查里console报错

基本数据类型
<div id="app">
    <p>{{ title }}</p>
    <p>{{ isAdult ? '成年' : '未成年' }}</p>
    <p>{{ arr[0] }}</p>
    <p>{{ arr[1] }}</p>
    <p>{{ arr[2] }}</p>
    <!-- [ 12, 23, 34 ] 如果直接插入一个符合数据类型,调用符合数据类型的 toString()方法 稍后学习其他的指令才可以做符合数据类型的遍历-->
    <p>{{ arr }}</p>
    <hr>
    <p>{{ obj.id }}</p>
    <p>{{ obj.name }}</p>
    <!-- { "id": 1, "name": "andy" } -->
    <p>{{ obj }}</p>
    <hr>
    <p>{{ infos[0].id }}</p>
    <p>{{ infos[0]['name'] }}</p>
    <p>{{ infos }}</p>
</div>
const vm = new Vue({
        el: '#app', // el是element的简写,属性值是一个选择器,选择vuejs 管理的dom区域
        /* data 代表是我们开发中的业务数据*/
        /* data 一般我们称之为:模型、 模型数据 模型对象*/
        data: {
            // 模型里面的属性一般我们称之为 模型变量
            unknow: null,
            unknow1: undefined,
            unknow2: [],
            unknow3: {},
            title: 'hi vuejs!',
            isAdult: true,
            version: '2.6',
            age: 23,
            arr: [12, 23, 34],
            obj: {id: 1, name: 'andy'},
            infos: [{id: 1, name: 'andy'}, {id: 2, name: 'mark'}]
        },

    })

在这里插入图片描述
对于基本数据类型来说,我们可以使用插值表达式直接的输出
对于复合数据类型来说,目前只能做基本的打印原始的格式,对输出是不友好、后期学习遍历语法

复合数据类型

以 v- 作为前缀的 dom元素的属性,是由 vuejs提供的,扩展dom元素的属性。一般称之为 vuejs 的指令,指令就是 vuejs 提供的给元素新的属性行为。

v-for

列表渲染
v-for用于做复合数据类型的遍历操作
v-for使用的语法 类似 js里面的 for…in语法

	<p>遍历获取元素</p>
    <p v-for="ele in arr">{{ ele }}</p>
    <hr>
    <p>遍历获取下标和元素</p>
    <p v-for="(ele, index) in arr">下标:{{ index }}, 元素:{{ ele }}</p>
    <hr>
    <h2>v-for遍历对象操作</h2>
    <p v-for="val in obj">{{ val }}</p>
    <p v-for="(val, attr) in obj">属性:{{ attr }},属性值:{{ val }}</p>
    <hr>
    <h2>v-for遍历对象数组</h2>
    <p v-for="ele in infos">
        <span>{{ ele.id }}</span>
        <span>{{ ele.name }}</span>
    </p>

ele in arr:ele的名字是可以自己取的,代表数组中的元素,in 后面的模型变量不能乱写
(val, attr) in obj:val代表值,attr代表属性,用(item,index)也是可以的
在这里插入图片描述
在这里插入图片描述
vuejs 里面除了提供 v-for指令 还提供了一系列的指令方便开发者使用
v-for API

v-html
<! -- v-htmL底层的逻辑dom.innerHTML = titLe-->
<! -- v-text底层的逻辑dom.innerText = title-->
<p v-html="title"></p>
<p v-text="title"></p>
<p v-htm1="title">标题:</p>
<p>注意1:如果使用v-html或者 v-text ,标签内部不要存放信息,不然会覆盖</p>
<p v-htm1="'标题:'+title"></p>

在这里插入图片描述
插值表达式使用的好好的,为什么要引入 v-html指令?

前端为了安全,会对HTML代码进行实体转义。转义之后HTML代码里面的标签就失效了,原封不动的显示,而不会被浏览器语义化当成HTML标签

<div>{{ message }}</div>
<hr>
<div v-html="message"></div>
const vm = new Vue({
        el: '#app',
        data: {
            // 模型里面的属性一般我们称之为 模型变量
            /*后台:富文本编辑器,内容是包含了HTML代码 */
            /* 富文本编辑器 百度 Ueditor*/
            /* https://github.com/fex-team/ueditor */
            message: `<div class="navbar navbar-inverse navbar-fixed-top ue-docs-nav" role="banner">
    <div class="container">
        <div class="navbar-header">
            <button class="navbar-toggle" type="button" data-toggle="collapse" data-target=".bs-navbar-collapse">
                <span class="sr-only"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a href="/ueditor" class="navbar-brand">UEditor Docs</a>
        </div>
        <nav class="collapse navbar-collapse bs-navbar-collapse" role="navigation">
            <ul class="nav navbar-nav">
                <li>
                    <a href="http://ueditor.baidu.com/website/onlinedemo.html" target="_blank">演示</a>
                </li>
                <li>
                    <a href="http://ueditor.baidu.com" target="_blank">官网</a>
                </li>
                <li>
                    <a href="https://github.com/fex-team/ueditor/issues" target="_blank">论坛</a>
                </li>
            </ul>
        </nav>
    </div>
</div>`,
        },
    })

在这里插入图片描述

v-bind

单向属性绑定(用于设置HTML属性)
v-bind :属性名= ’ 数据 ’
:bind :属性名 = ’ 数据 ’ (简写)

	<img v-bind:src="bdLogoImgUrl" alt="">
    <hr>
    <p>简化写法</p>
    <img :src="bdLogoImgUrl" alt="">
const vm = new Vue({
        el: '#app',
        data: {
            bdLogoImgUrl: 'https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png',
	}
}

在这里插入图片描述
除了绑定src还能绑定样式和class

<style>
        .p1 {
            background-color: red;
        }
        .p2 {
            color: blue;
        }
</style>
<p>样式的绑定</p>
    <!--<p class="p1">Lorem ipsum dolor sit amet, consectetur.</p>-->
    <p v-bind:class="class1">Lorem ipsum dolor sit amet, consectetur.</p>
    <p :class="class1">Lorem ipsum dolor sit amet, consectetur.</p>

    <p :class="classNameArr">Lorem ipsum dolor sit amet, consectetur.</p>
    <p :class="['p1', 'p2']">Lorem ipsum dolor sit amet, consectetur.</p>
    <p :class="classNameObj">Lorem ipsum.</p>
const vm = new Vue({
        el: '#app',
        data: {
            class1: 'p1',
            classNameArr: ['p1', 'p2'],
            classNameObj: {'p1': true, 'p2': true},
            //true 显示 false 不显示
	}
}

在这里插入图片描述

v-on

指令用于绑定HTML事件可以 如果绑定多个事件,可以用键值对的形式 事件类型:事件名
如果绑定是多个相同事件,直接用逗号分隔就行

<div id="app">
    <!-- v-on: 后面的值就是原生的 js事件不需要加上 on前缀 onClick-->
    <button v-on:click="handlerClick">点击我</button>
    <button v-on:click="handlerClick()">点击我</button>
    <button v-on:click="handlerClick($event)">点击我</button>
    <button v-on:click="handlerClick($event, '用户自定义的属性1', '第三个参数')">点击我</button>
    <hr>
    <!--@ == v-on:简化写法-->
    <button @click="handlerClick($event, '用户自定义的属性1', '第三个参数')">点击我</button>
    <hr>
    用户名:<input type="text" @change="handlerChange">
    <hr>
    邮箱:<input type="text" @keyup="handlerKeyup">
</div>
methods: {
            handlerChange() {
                console.log('handlerChange');
            },
            handlerKeyup() {
                console.log('handlerKeyup');
            },
            /* es6对象简化写法*/
            handlerClick(event, ...args) {
                /* ... es6里面的剩余参数*/
                console.log(event.target, args); // 当前的 dom对象
                // alert('我被点击了!');
            }
        } // 定义事件的回调函数

在这里插入图片描述

v-mode

双向绑定
v-model 用于表单信息的接收

<input type="text" name="username" v-model="username">
<p>{{ username }}</p>
data: {username: '初始化的默认值'}

在这里插入图片描述
在这里插入图片描述

v-if 和 v-show
v-if

条件渲染

<h2>v-if和v-show</h2>
<p v-if="showStatus">Lorem ipsum dolor sit amet, consectetur adipisicing.</p>
<hr>
<p v-if="showStatus">v-if如果为真,则显示</p>
<p v-else>v-if如果为假 else里面的东西展示</p>
<hr>
data: {showStatus: true}

在这里插入图片描述


data: {showStatus: false}

在这里插入图片描述

v-show

显示和隐藏,display:none 和 display:block

<h2 v-show="showStatus">v-show</h2>
data: {showStatus: false}
//true则显示 false不显示
v-if和v-show有什么区别?
  • 相同点:可以控制dom元素的显示与否
  • 区别:v-if是控制dom元素的移除与新增;
    v-show是控制元素显示与隐藏的 display属性的值为:none或者block
    用户如果切换频繁状态应该用v-show
    如果页面是刷新进入页面状态那么v-show的性能差一点

显示:
在这里插入图片描述

不显示:
在这里插入图片描述

计算属性

模板语法内如果添加特别复杂的逻辑,会让模板表达式比较重而且难以维护,对于任何复杂逻辑,都应当使用计算“属性”

<div id="app">
{{changeStr}}
</div>

<script>
export default {
	name: 'App' ,
	data () {
		return {
		str: '123'}
		},
	//计算属性写法! 一定要有return
	computed:{
		changeStr(){//不是函数是属性!
		return this.str.split('').reverse().join('');
	}
}}
</script>

计算属性(computed)是基于他们的响应式依赖进行缓存的

class

对象的写法
:class='{active: false,on:true} '
数组的写法
<div :class=' [activeclass,onClass]'></div>
经常用来各种判断赋值的
:class=' currentIndex==index ? "active" :" " '

style

某一个或者某几个值发生变化的时候

<div :style='styleclass'>这是style的写法</div>
	data(){
		return {
			styleclass:{
				background: ' blue' ,
				fontSize: ' 50px',
				color: 'orange'
			}
		}
	}
src路径

img :src 一旦是绑定的数据,那么他会类似于请求的数据了,需要从路径上查找
<img src="./assets/img/logo.png"> ==>src目录
<img :src="">===>public目录

vue项目自适应

全局引入在main.js里,局部在.vue里
import './assets/js/flexible.js'

1.如果是局部引入(单独的某一个页面生效).vue文件中引入
2.如果是全局引入(在main.js中引入)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值