前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vue入门(一)——基本概念

Vue入门(一)——基本概念

作者头像
matt
发布2022-10-25 16:07:41
4100
发布2022-10-25 16:07:41
举报
文章被收录于专栏:CSDN迁移CSDN迁移

Vue入门(一)——基本概念

官方教程

一、介绍

渐进式:由浅入深 响应式:及时更新

  • 优点: 体积小,压缩后33K; 虚拟DOM,更高的运行效率; 双向数据绑定,不用操作DOM对象; 生态丰富,学习成本低。

HTML说明:

  1. JavaScript 是所有现代浏览器以及 HTML5 中的默认脚本语言,不必在<script>标签中使用type="text/javascript"
  2. 通常的做法是把函数放入<head>部分中,或者放在页面底部。这样就可以把它们安置到同一处位置,不会干扰页面的内容。
  3. 如果在文档已完成加载后执行 document.write,整个 HTML 页面将被覆盖。

二、基础

1. 创建Vue实例

Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统。

代码语言:javascript
复制
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<!-- 生产环境版本,优化了尺寸和速度 -->
<script src="https://cdn.jsdelivr.net/npm/vue"></script>

注意我们不再和 HTML 直接交互了。一个 Vue 应用会将其挂载到一个 DOM 元素上 (#{dom-name}) 然后对其进行完全控制。那个 HTML 是我们的入口,但其余都会发生在新创建的 Vue 实例内部。

代码语言:javascript
复制
el: 挂载点

Vue会管理el选择命中的元素及内部的后代元素
CSS选择器:`#`对应id,`.`对应class,标签选择器也可以

一个 Vue 应用由一个通过 new Vue 创建的根 Vue 实例,以及可选的嵌套的、可复用的组件树组成。Vue 组件都是 Vue 实例,并且接受相同的选项对象 (一些根实例特有的选项除外)。

代码语言:javascript
复制
var vm = new Vue({
	el: {}
	data: {}
	methods: {}
	...
})

2. 数据与方法

当一个 Vue 实例被创建时,它将如下 obj 对象中的所有的 property 加入到 Vue 的响应式系统中。当这些 property 的值发生改变时,视图将会产生“响应”,即匹配更新为新的值。

这里唯一的例外是使用 Object.freeze(),这会阻止修改现有的 property。 除了数据 property,Vue 实例还暴露了一些有用的实例 property 与方法。它们都有前缀 $,以便与用户定义的 property 区分开来。

代码语言:javascript
复制
<div id="app">{{ a }}</div>
<div id="app2">{{ b }}</div>
-------------------------------------------------
var obj = {
  a: 'apple',
  b: 'boy'
}
Object.freeze(obj)

var vm = new Vue({
  el: '#app',  // 对应id为app的标签
  data: obj
})
var vm2 = new Vue({
  el: '#app2',  // 对应id为app的标签
  data: obj
})

vm.$watch('a', function (newValue, oldValue) {
  // 这个回调将在 `vm.a` 改变后调用
})

3. 生命周期

每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数。

beforecreated、created、beforemounted、mounted、beforeupdated、updated等等。

代码语言:javascript
复制
new Vue({
  data: {
    a: 1
  },
  created: function () {
    // `this` 指向 vm 实例
    console.log('a is: ' + this.a)
  }
})

4. 模板语法

(1)插值 数据绑定最常见的形式就是使用“Mustache”语法 (双大括号) 的文本插值:

代码语言:javascript
复制
<span>
	Message: {{ msg }}
</span>

// 执行一次性地插值,当数据改变时,插值处的内容不会更新
<span v-once>
	Message: {{ msg }}
</span>

Mustache 标签将会被替代为对应数据对象上 msg property 的值。无论何时,绑定的数据对象上 msg property 发生了改变,插值处的内容都会更新。

(2)原始 HTML

代码语言:javascript
复制
<p>
	Using mustaches: {{ rawHtml }}
</p>

// 使用v-html指令,输出真正的HTML。这个 span 的内容将会被替换成为 property 值 rawHtml
<p>
	Using v-html directive: <span v-html="rawHtml"></span>
</p>

(3)HTML Attribute

代码语言:javascript
复制
<div v-bind:class="color" id="app">Test</div>
---------------------------------------------------
var vm = new Vue({
	el: "#app",
	data: {
		color: 'red'
	}
})
.red{color:red; font-size:100px;}

(4)Javascript表达式 对于所有的数据绑定,Vue.js 都提供了完全的 JavaScript 表达式支持。

代码语言:javascript
复制
{{ number + 1 }}

{{ ok ? 'YES' : 'NO' }}

{{ message.split('').reverse().join('') }}

<div v-bind:id="'list-' + id"></div>

(5)指令 指令 (Directives) 是带有 v- 前缀的特殊 attribute。当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM。

指令名称

作用

v-if

条件渲染(惰性渲染,切换开销大),根据表达式真假来插入/移除标签,还有v-else, v-else-if

v-show

条件渲染(一定渲染,初始化开销大),根据条件展示/不展示标签,切换元素CSS property中的display

v-bind

响应式的更新HTML attribute

v-on

时间处理,监听DOM事件,并在触发时运行一些 JavaScript 代码(最好是在Vue()的methods中)

v-for

列表渲染,基于一个数组来渲染一个列表,使用 item in items (或(item, index) in items)形式的特殊语法

v-model

在表单 <input>、<textarea> 及 <select> 元素上创建双向数据绑定,它会根据控件类型自动选取正确的方法来更新元素

  • 参数 一些指令能够接收一个“参数”,在指令名称之后以冒号表示。
代码语言:javascript
复制
<a v-bind:href="url">...</a>
<a v-on:click="doSomething">...</a>

// 动态参数,当data中attributeName的值为href时,同上
<a v-bind:[attributeName]="url">...</a>
  • 修饰符 修饰符 (modifier) 是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。
代码语言:javascript
复制
<form v-on:submit.prevent="onSubmit">...</form>
  • 缩写
代码语言:javascript
复制
// v-bind
<!-- 完整语法 -->
<a v-bind:href="url">...</a>

<!-- 缩写 -->
<a :href="url">...</a>


// v-on
<!-- 完整语法 -->
<a v-on:click="doSomething">...</a>

<!-- 缩写 -->
<a @click="doSomething">...</a>

(6)代码演示

代码语言:javascript
复制
// v-if
<div v-if="type === 'A'">A</div>
<div v-else-if="type === 'B'">B</div>
<div v-else-if="type === 'C'">C</div>
<div v-else>Not A/B/C</div>


// v-for
<ul id="example-2">
  <li v-for="(item, index) in items">
    {{ parentMessage }} - {{ index }} - {{ item.message }}
  </li>
</ul>

var example2 = new Vue({
  el: '#example-2',
  data: {
    parentMessage: 'Parent',
    items: [
      { message: 'Foo' },
      { message: 'Bar' }
    ]
  }
})


// v-on
// 1.存在事件修饰符:.stop/.prevent/.capture/.self/.once/.passive
// 例如: submit.prevent 提交事件不再重载页面
// 2.存在按键修饰符,监听键盘按键:.enter/.tab/.esc/...
<div id="example-1">
  <button v-on:click="say('hi')">Say hi</button>
  <button v-on:click="say('what')">Say what</button>
</div>

new Vue({
  el: '#example-3',
  methods: {
    say: function (message) {
      alert(message)
    }
  }
})


// v-model
// 修饰符:.lazy 输入后不立刻修改/.number/.trim
<div id="demo2">
	<span>Multiline message is:</span>
	<p style="white-space: pre-line;">{{ message }}</p>
	<textarea v-model="message" placeholder="add multiple lines"></textarea>
</div>

<script>
new Vue({
	el: '#demo2',
	data: {
		message: ''
	}
})
</script>

5. 侦听器

计算属性computed:是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。

代码语言:javascript
复制
var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar',
    fullName: 'Foo Bar'
  },
  watch: {
    firstName: function (val) {
      this.fullName = val + ' ' + this.lastName
    },
    lastName: function (val) {
      this.fullName = this.firstName + ' ' + val
    }
  }
})

// 计算属性存在缓存
var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar'
  },
  computed: {
    fullName: function () {
      return this.firstName + ' ' + this.lastName
    }
  }
})

6. 组件基础

(1)基本示例

代码语言:javascript
复制
<div id="components-demo">
	<button-counter></button-counter>
	<button-counter></button-counter>
</div>

<script>
	Vue.component('button-counter', {
		// 一个组件的 data 必须是一个函数,每个实例可以维护一份被返回对象的独立的拷贝。否则会影响其他组件的值
		data: function () {
			// 若这里return一个前面定义好的val,则多个组件会同时更改值
			return {
				count: 0
			}
		},
		template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
	});
	new Vue({
		el: '#components-demo' ,
	});
</script>

(2) 组件注册

  • 组件名规范 使用“kebab-case”的格式,小写字母加短横线分割。
  • 全局注册 全局注册的组件可以用在其被注册之后的任何 (通过 new Vue) 新创建的 Vue 根实例,也包括其组件树中的所有子组件的模板中。
代码语言:javascript
复制
Vue.component('my-component-name', {
  // ... options ...
})
  • 局部注册
代码语言:javascript
复制
var ComponentA = { /* ... */ }
var ComponentB = { /* ... */ }

// 注意局部注册的组件在其子组件中不可用,需要在其中再定义components。
new Vue({
  el: '#app',
  components: {
    'component-a': ComponentA,
    'component-b': ComponentB
  }
})
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Vue入门(一)——基本概念
  • 一、介绍
  • 二、基础
    • 1. 创建Vue实例
      • 2. 数据与方法
        • 3. 生命周期
          • 4. 模板语法
            • 5. 侦听器
              • 6. 组件基础
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档