Vue2.0精要版

https://www.runoob.com/vue2/vue-start.html

一、最简单使用vue的方法–helloworld

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 测试</title>
<!-- 
可直接引入js的方式。(但vue单独构建的项目好像很多文件夹?可能那种方式是自动规整了文件)
可通过vue官网找到最新的
Staticfile CDN(国内) : https://cdn.staticfile.org/vue/2.2.2/vue.min.js
unpkg:https://unpkg.com/vue/dist/vue.js, 会保持和 npm 发布的最新的版本一致。
cdnjs : https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.8/vue.min.js
-->
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>
<body>
<div id="app">
  <p>{{ message }}</p>
</div>

<script>
//({})就是 js 中的对象,因为放在开头可能会被识别为代码块,所以加了括号。
new Vue({
  el: '#app',//el是element的缩写
  data: {
    message: 'Hello Vue.js!'
  }
})
</script>
</body>
</html>

注:在php中 data快中传参的方式
whats: <?=json_encode($sss)?> //<?= 相当于<?php echo?>
注2:vue的 <template> ,需要使用vue后缀的文件,是框架,非这种直接引入js的方式,在后面详细介绍

引入vue和安装vue的区别

直接在HTML中引vue.js和npm安装有什么区别?

首先使用npm安装Vue和直接在HTML中引入vue.js,这两种方式都可以使用vue.js。

区别在于,
使用npm安装Vue可以方便包管理。等到应用需要越来越多的前端库和前端框架的时候,一个一个在HTML文件中引入会很不方便。
引用Vue.js后可以在 浏览器上直接使用Vue 的实例。
安装只能通过编译后,才可在浏览器上运行查看效果。
其实过多的说明都不如你先试试使用 script引用的方法开发一遍,你会在发开遇到各种不顺畅,或者过多的重复性工作。到时候回头来使用vue-cli,你就会突然明白,原来vue-cli是用来干这个的。

代码示例见下一节,主要是<template>

和传统js的区别–MVVM架构

以前的 DOM 操作,如果你想改变某个 DOM 元素的显示内容,比如一个view的显示文字:给view设id,然后js里通过选择器获取 DOM 元素,进一步通过js进行赋值操作,修改 DOM 元素的属性或值。

 <html>  
        <head>  
            <script type="text/javascript">  
                document.addEventListener("DOMContentLoaded",function () {  
                    document.getElementById("spana").innerText="456"  
                })  
                function changetextvalue () {  
                    document.getElementById("spana").innerText="789"  
                }  
            </script>  
        </head>  
        <body>  
            <span id="spana">123</span>  
            <button type="button" onclick="changetextvalue()">修改为789</button>  
        </body>  
    </html>

现在的做法,是vue的绑定模式,给这个 DOM 元素绑定一个js变量,在script中修改js变量的值,DOM 会自动变化,页面会自动更新渲染。
前端改用 MVVM (Model-View-ViewModel的简写)模式,简单来说,Model:代表数据模型,View:只专注视图UI处理,ViewModel:只处理业务和数据。它的核心是 MVVM 中的 VM,也就是 ViewModel。 ViewModel负责连接 View 和 Model,保证视图和数据的一致性,这种轻量级的架构让前端开发更加高效、便捷,大幅减少代码行数,同时差量渲染性能更好。

   <template>  
        <view>  
            <text>{{textvalue}}</text><!-- 这里演示了组件值的绑定 -->  
            <button :type="buttontype" @click="changetextvalue()">修改为789</button><!-- 这里演示了属性和事件的绑定 -->  
        </view>  
    </template>  
    <script>  
    //固定写法
        export default {  
        //data函数
            data() {  
                return {  
                    textvalue:"123",  
                    buttontype:"primary"  
                };  
            },  
            onLoad() {  
                this.textvalue="456"//这里修改textvalue的值,其实123都来不及显示就变成了456  
            },  
            //methods
            methods: {  
                changetextvalue() {  
                    this.textvalue="789"//这里修改textvalue的值,页面自动刷新为789  
                }  
            }  
        }  
    </script>

更详细的示例–包含方法、多个数据、多个节点

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
	<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
</head>
<body>
	<div id="vue_det">
		<h1>site : {{site}}</h1>
		<h1>url : {{url}}</h1>
		<h1>{{details()}}</h1>
	</div>
	<script type="text/javascript">
		var vm = new Vue({  //此处如果有多个节点 那么取一个var xxx=new vue({}) 就行了
			el: '#vue_det',
			data: {
				site: "菜鸟教程",
				url: "www.runoob.com",
				alexa: "10000"
			},
			methods: {
				details: function() {
					return  this.site + " - 学的不仅是技术,更是梦想!";
				}
			}
		})
		//在外部 vm.site和data.site似乎是一样的
	</script>
</body>
</html>

$符号

Vue 实例还提供了一些有用的实例属性与方法。它们都有前缀 $,以便与用户定义的属性区分开来。
vm是vue对象(名字可以随便取),里面可以定义data、method等属性。但不代表method都要在vue对象里面去写。
例如:

<div id="vue_det">
    <h1>site : {{site}}</h1>
    <h1>url : {{url}}</h1>
    <h1>Alexa : {{alexa}}</h1>
</div>
<script type="text/javascript">
// 我们的数据对象
var data = { site: "菜鸟教程", url: "www.runoob.com", alexa: 10000}
var vm = new Vue({
    el: '#vue_det',
    data: data
})
 
document.write(vm.$data === data) // true  美元符号在这里
document.write("<br>") 
document.write(vm.$el === document.getElementById('vue_det')) // true 美元符号在这里
</script>

vue模板语法 v-族

语法

{{xx}}的方式见上方
v-html输出html
<div id="app">
    <div v-html="message"></div>
</div>
    
<script>
new Vue({
  el: '#app',
  data: {
    message: '<h1>菜鸟教程</h1>'
  }
})
</script>
属性v-bind

HTML 属性中的值应使用 v-bind 指令。如

<div v-bind:class="{'class1': use}">
以下实例判断 use 的值,如果为 true 使用 class1 类的样式,否则不使用该类:

<div id="app">
  <div v-bind:class="{'class1': use}">
    v-bind:class 指令
  </div>
</div>
    
<script>
new Vue({
    el: '#app',
  data:{
      use: false
  }
});
</script>
没有引号时
<div id="app">
    <div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }">菜鸟教程</div>
</div>
<div id="app">
    <pre><a v-bind:href="url">菜鸟教程</a></pre>
</div>
    
<script>
new Vue({
  el: '#app',
  data: {
    url: 'http://www.runoob.com'
  }
})

数组语法
我们可以把一个数组传给 v-bind:class ,实例如下:

<div v-bind:class="[activeClass, errorClass]"></div>

以上实例 div class 为实际的值,如:

<div class="active text-danger"></div>

三目表达式,如

<div v-bind:class="[errorClass ,isActive ? activeClass : '']"></div>
v-if
<div id="app">
    <p v-if="seen">现在你看到我了</p>
</div>
    
<script>
new Vue({
  el: '#app',
  data: {
    seen: true
  }
})
</script>
<div id="app">
    <div v-if="type === 'A'">
      A
    </div>
    <div v-else-if="type === 'B'">
      B
    </div>
    <div v-else>
      Not A/B
    </div>
</div>
v-show

我们也可以使用 v-show 指令来根据条件展示元素:

<h1 v-show="ok">Hello!</h1>
v-for

v-for 指令需要以 site in sites 形式的特殊语法, sites 是源数据数组并且 site 是数组元素迭代的别名。

<div id="app">
  <ol>
    <li v-for="site in sites">
      {{ site.name }}
    </li>
  </ol>
</div>
 
<script>
new Vue({
  el: '#app',
  data: {
    sites: [
      { name: 'Runoob' },
      { name: 'Google' },
      { name: 'Taobao' }
    ]
  }
})
</script>
你也可以提供多个参数为键名:

v-for
<div id="app">
  <ul>
    <li v-for="(value, key) in object">
    {{ key }} : {{ value }}
    </li>
  </ul>
</div>
v-for 也可以循环整数

v-for
<div id="app">
  <ul>
    <li v-for="n in 10">
     {{ n }}
    </li>
  </ul>
</div>
v-on
可这样
<button v-on:click="counter += 1">增加 1</button>

<form v-on:submit.prevent="onSubmit"></form>
在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定:
v-on 监听事件

<div id="app">
    <p>{{ message }}</p>
    <button v-on:click="reverseMessage">反转字符串</button>
</div>

<script>
new Vue({
  el: '#app',
  data: {
    message: 'Runoob!'
  },
  methods: {
    reverseMessage: function () {
      this.message = this.message.split('').reverse().join('')
    }
  }
})
</script>
带参数

1、函数申明有参数,视图那没有

greet: function (event) {
  
      // `event` 是原生 DOM 事件
      if (event) {
          alert(event.target.tagName)
      }

2、函数申明、视图都有参数

 <div id="app">
  <button v-on:click="say('hi')">Say hi</button>
  <button v-on:click="say('what')">Say what</button>
</div>
 
<script>
new Vue({
  el: '#app',
  methods: {
    say: function (message) {
      alert(message)
    }
  }
})
</script>
修饰符
事件修饰符,如

.left - 左键事件
.right - 右键事件

<!-- click 事件只能点击一次,2.1.4版本新增 -->
<a v-on:click.once="doThis"></a>
阻止事件冒泡的例子
<div id="app">
        <div v-on:click="do2">
            <button v-on:click="do1">阻止单击事件继续传播</button>
            <!--若不改 会弹窗1,2 若改为v-on:click.stop="do1"则只会弹1 -->
        </div>
    </div>

    <script>
        var app = new Vue({
            el: "#app",
            data: {
                name: "Vue.js"
            },
            methods: {
                do1: function () {
                    alert("1");
                },
                do2: function () {
                    alert("2");
                }
            }
        });
    </script>
按键修饰符
<!-- 同上 -->
<input v-on:keyup.enter="submit">
<!-- 缩写语法 -->
<input @keyup.enter="submit">
v-model处理用户输入,实现双向数据绑定
<div id="app">
    <p>{{ message }}</p>
    <input v-model="message">
</div>
    
<script>
new Vue({
  el: '#app',
  data: {
    message: 'Runoob!'
  }
})
</script>
过滤器

Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。由"管道符"指示, 格式如下:

<!-- 在两个大括号中 -->
{{ message | capitalize }}

<!-- 在 v-bind 指令中 -->
<div v-bind:id="rawId | formatId"></div>

过滤器函数接受表达式的值作为第一个参数。

以下实例对输入的字符串第一个字母转为大写:

实例

<div id="app">
  {{ message | capitalize }}
</div>
    
<script>
new Vue({
  el: '#app',
  data: {
    message: 'runoob'
  },
  filters: {
    capitalize: function (value) {
      if (!value) return ''
      value = value.toString()
      return value.charAt(0).toUpperCase() + value.slice(1)
    }
  }
})
</script>

支持完整js表达式

<div id="app">
    {{5+5}}<br>
    {{ ok ? 'YES' : 'NO' }}<br>
    {{ message.split('').reverse().join('') }}
    <div v-bind:id="'list-' + id">菜鸟教程</div>
</div>
    
<script>
new Vue({
  el: '#app',
  data: {
    ok: true,
    message: 'RUNOOB',
    id : 1
  }
})
</script>

缩写

v-bind 缩写
Vue.js 为两个最为常用的指令提供了特别的缩写:

<!-- 完整语法 -->
<a v-bind:href="url"></a>
<!-- 缩写 -->
<a :href="url"></a>

v-on 缩写

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

属性值不需要花括号

<div id="app">
  <button v-on:click="counter += 1">增加 1</button>
  <p>这个按钮被点击了 {{ counter }} 次。</p>
</div>
 
<script>
new Vue({
  el: '#app',
  data: {
    counter: 0
  }
})
</script>

VUE点击按钮自动刷新

原因:使用了原生的button按钮,而使用原生按钮需要注意的是:原生按钮button默认type='submit’这个属性值是默认具有表单提交功能的,所以在非IE浏览器下会存在点击后刷新页面的问题

解决方案1:在原生button按钮中更改type='button’属性值就可以了,此时它就是一个单纯的按钮了
解决方案2: 可以使用input标签,然后再设置type='button’也能解决
解决方案3: 自己写块元素,通过样式更改为按钮

计算属性

可以看下以下反转字符串的例子:

<div id="app">
  {{ message.split('').reverse().join('') }}
</div>

上述实例中模板很复杂,也不容易看懂理解。

接下来我们看看使用了计算属性的实例:

<div id="app">
  <p>原始字符串: {{ message }}</p>
  <p>计算后反转字符串: {{ reversedMessage }}</p>
</div>
 
<script>
var vm = new Vue({
  el: '#app',
  data: {
    message: 'Runoob!'
  },
  computed: {
    // 计算属性的 getter
    reversedMessage: function () {
      // `this` 指向 vm 实例
      return this.message.split('').reverse().join('')
    }
  }
})
</script>

computed vs methods

我们可以使用 methods 来替代 computed({{ reversedMessage2() }}即可),效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

getter和setter

即小程序里的get和set
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :

var vm = new Vue({
  el: '#app',
  data: {
    name: 'Google',
    url: 'http://www.google.com'
  },
  computed: {
    site: {
      // getter
      get: function () {
        return this.name + ' ' + this.url
      },
      // setter
      set: function (newValue) {
        var names = newValue.split(' ')
        this.name = names[0]
        this.url = names[names.length - 1]
      }
    }
  }
})
// 调用 setter, vm.name 和 vm.url 也会被对应更新
vm.site = '菜鸟教程 http://www.runoob.com';
document.write('name: ' + vm.name);
document.write('<br>');
document.write('url: ' + vm.url);

监听属性

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
</head>
<body>
<div id = "app">
 <p style = "font-size:25px;">计数器: {{ counter }}</p>
 注意这里可以这样
 <button @click = "counter++" style = "font-size:25px;">点我</button>  
</div>
<script type = "text/javascript">
 var vm = new Vue({
    el: '#app',
    data: {
       counter: 1
    }
 });
 vm.$watch('counter', function(nval, oval) {
    alert('计数器值的变化 :' + oval + ' 变为 ' + nval + '!');
 });
</script>
</body>
</html>

表单

.trim
如果要自动过滤用户输入的首尾空格,可以添加 trim 修饰符到 v-model 上过滤输入:

<input v-model.trim="msg">

其他见教程

组件

在这里插入图片描述
注册一个全局组件语法格式如下:

Vue.component(tagName, options)

tagName 为组件名,options 为配置选项。注册后,我们可以使用以下方式来调用组件:

<tagName></tagName>

全局组件

<div id="app">
    <runoob></runoob>
</div>
 
<script>
// 注册
Vue.component('runoob', {
  template: '<h1>自定义组件!</h1>'
})
// 创建根实例
new Vue({
  el: '#app'
})
</script>

局部组件

我们也可以在实例选项中注册局部组件,这样组件只能在这个实例中使用:
注册一个简单的局部组件 runoob,并使用它:

<div id="app">
    <runoob></runoob>
</div>
 
<script>
var Child = {
  template: '<h1>自定义组件!</h1>'
}
 
// 创建根实例
new Vue({
  el: '#app',
  components: {
    // <runoob> 将只在父模板可用
    'runoob': Child
  }
})
</script>

父组件、子组件、路由等略复杂 先不看

过渡动画

<transition>标签

ajax

Vue.js 2.0 版本推荐使用 axios 来完成 ajax 请求。

others

v-model似乎不应该到处都用?仅仅需要多个地方同步值渲染的时候再用 不然好像更麻烦?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值