vue基础(1)

一.Vue是什么

  1. Vue是用于构建用户界面的渐进式框架。
  2. Vue 的核心库只关注视图层,采用自底向上增量开发的设计。
  3. 易于上手,Vue 也能为复杂的单页应用提供驱动。

Vue和react相同和不同:
相同点:
  1、都使用虚拟dom,
  2、提供了响应式和组件化的视图组件
  3、注意力集中保持在核心库,而将其他功能如路由和全局状态管理交给相关的库。
不同点:
  1、vue具有双向绑定的数据流,react则是单向数据流,没有双向绑定
  2、vue语法较简单,适合小型项目开发,上手快。react适合中大型项目开发。
  3、vue倾向于html,css,js分离的写法。react则通过jsx渲染模板,html,css全部写入js中。

二.安装

  1. 开发环境版本,包含了有帮助的命令行警告
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

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

  3. 使用npm,版本大于3.0

安装node
npm install vue
npm install --global vue-cli
vue  init webpack  mydemo1  //创建一个基于 webpack 模板的新项目
cd  mydemo1
npm  install
npm  run  dev

三.目录结构

四.V-if和v-show

v-if用法:和if判断类似,v-else-if也可链式多次调用。条件为true显示对应div中的内容。

<div id="app">
    <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>
</div>
<script>
new Vue({
  el: '#app',
  data: {
    type: 'C'
  }
})
</script>

v-show用法:和v-if一样,条件为true就显示对应div内的样式

<div id="app">
    <h1 v-show="ok">Hello!</h1>
</div>
<script>
new Vue({
  el: '#app',
  data: {
    ok: true
  }
})
</script>

v-if和v-show的区别:

  1. v-if 是动态添加,当值为 false 时,是完全移除该元素,即 dom 树中不存在该元素。
  2. v-show 仅是隐藏 / 显示,值为 false 时,该元素依旧存在于 dom 树中。若其原有样式设置了 display: none 则会导致其无法正常显示。
  3. v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——在条件第一次变为真时才开始局部编译(编译会被缓存起来)。
  4. v-show 简单得多——元素始终被编译并保留,只是简单地基于 CSS 切换。
  5. 一般来说,v-if 有更高的切换消耗而 v-show 有更高的初始渲染消耗。因此,如果需要频繁切换 v-show 较好,如果在运行时条件不大可能改变 v-if 较好。

五.v-for

<div id="app">
  <ol>
    <li v-for="(index,site) in sites" :key="index">
      {{ site.name }}
    </li>
  </ol>
</div>
<script>
new Vue({
  el: '#app',
  data: {
    sites: [
      { name: 'Jingdong' },
      { name: 'Pingduoduo' },
      { name: 'Taobao' }
    ]
  }
})
</script>

sites可以是数组,也可以是对象

<div id="app">
  <ul>
    <li v-for="(value, key) in object" :key="key">
    {{ key }} : {{ value }}
    </li>
  </ul>
</div>
<script>
new Vue({
  el: '#app',
  data: {
    object: {
      name: 'baidu',
      url: 'http://www.baidu.com',
      slogan: '百度一下,你就知道!'
    }
  }
})
</script>

Key的作用:

  1. 在写v-for的时候,都建议给元素加上一个key属性
  2. key的主要作用就是用来提高渲染性能的!
  3. key属性可以避免数据混乱的情况出现 (如果元素中包含了有临时数据的元素,如果不用key就会产生数据混乱)

v-for和v-if不建议同时使用,在v-for中使用v-if可能导致v-if失效
在组件中使用v-for,需要使用props传递参数(详见组件基础)

数组更新检测:
Vue 将被侦听的数组的变异方法进行了包裹,所以它们也将会触发视图更新。这些被包裹过的方法包括:

 push()
 pop()
 shift()
 unshift()
 splice()
 sort()
 reverse()

如 filter()、concat() 和 slice() 。它们不会改变原始数组,而总是返回一个新数组。

六.Vue事件

<div id="app">
  <!-- v-on:click 可以简写成 @click -->
  <button v-on:click="say('hi')">Say hi</button>
</div>
<script>
new Vue({
  el: '#app',
  methods: {
    say: function (message) {
      alert(message)
    }
  }
})
</script>

事件修饰符:
阻止单击事件冒泡
<a v-on:click.stop="doThis"></a>
提交事件不再重载页面
<form v-on:submit.prevent="onSubmit"></form>
修饰符可以串联
<a v-on:click.stop.prevent="doThat"></a>
只有修饰符
<form v-on:submit.prevent></form>
添加事件侦听器时使用事件捕获模式
<div v-on:click.capture="doThis"></div>
只当事件在该元素本身(而不是子元素)触发时触发回调
<div v-on:click.self="doThat">...</div>
click 事件只能点击一次,2.1.4版本新增
<a v-on:click.once="doThis"></a>

按键修饰符:

.enter
.tab
.delete (捕获 "删除" 和 "退格" 键)
.esc
.space
.up
.down
.left
.right
.ctrl
.alt
.shift
.meta

<-- Enter -->
<input @keyup.enter="submit">
<-- Alt + C -->
<input @keyup.alt.67="clear">
<-- Ctrl + Click -->
<div @click.ctrl="doSomething">Do something</div>

七.表单输入绑定

输入框:
v-model的值为输入框中绑定的值,可在data中进行初始化。

<div id="app">
  <input v-model="message" placeholder="编辑我……">
  <textarea v-model="message2" placeholder="多行文本输入……"></textarea>
</div>
<script>
new Vue({
  el: '#app',
  data: {
    message: '单行输入框!',
    message2: '多行输入框!'
  }
})
</script>

单选复选框:

复选框:
<input type="checkbox" id="pinduoduo" value="pinduoduo" v-model="checkedNames">
<input type="checkbox" id="jingdong" value="jingdong" v-model="checkedNames">
<input type="checkbox" id="taobao" value="taobao" v-model="checkedNames">

单选框:
<input type="radio" id="baidu" value="baidu" v-model="picked">
<input type="radio" id="google" value="Google" v-model="picked">

data: {
  checkedNames: ['pinduoduo'],
  picked : 'baidu'
}

select下拉列表:

<div id="app">
  <select v-model="selected" name="fruit">
    <option value="">选择一个网站</option>
    <option value="www.baidu.com">Baidu</option>
    <option value="www.google.com">Google</option>
  </select>
  <div id="output">
      选择的网站是: {{selected}}
  </div>
</div>
<script>
new Vue({
  el: '#app',
  data: {
    selected: ''
  }
})
</script>

.lazy
一般情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步。你可以添加 lazy 修饰符,从而转为在 change 事件之后进行同步:
在“change”时而非“input”时更新
<input v-model.lazy="msg">

.number
自动将输入的值转换为数值类型
<input v-model.number="age" type="number">

.trim
自动去除输入内容的前后空格(中间不能去除)
<input v-model.trim="msg">

八.过滤器

1.内置过滤器

{{message | capitalize}} // 首字母大写
{{message | uppercase}} // 全部大写
{{message | lowercase}} // 全部小写
{{message | currency}} // 输出金钱以及小数点 <!--输出$123.47-->
{{message | currency '¥' "1"}}// 输出金钱以及小数点 <!--输出¥123.5-->
{{message | pluralize}} // 首字母大写
{{message | orderBy}} // 排序
{{message | debounce}} // 事件延迟Xms执行,需要再事件@中使用

<button id="btn" @click="disappear | debounce 5000">点击我,我将5秒后消失</button>

{{message | limitBy}} //在v-for中执行,两个参数分别是取得数量和偏移量

<ul v-for="item in lili | limitBy 10 3"> <!--输出 4 5 6 7 8 9 10 11 12 13-->

{{message | filterBy}}

data: {
      lili: ["oi", "oa", "ll", "lo" ,"ouo" ,"kk" ,"oala"],
      man: [   //此处注意man是数组,不是对象
      	{name: "lily"},{name: "lucy"},{name: "oo"},
      	{dada: "lsh"},{dada: "ofg"}
      ]}
<ul v-for="item in lili | filterBy 'o' ">
    <li>{{item}}</li>
</ul>
<!--输出oi oa lo ouo oala-->

<ul v-for="item in man | filterBy 'l' in 'name' ">
    <li>{{item.name}}</li>
</ul>
<!--输出lily lucy-->

<ul v-for="item in man | filterBy 'l' in 'name' 'dada' "> 
    <li>{{item.name+"+"+item.dada}}</li>
</ul>
<!--输出lily+undefined lucy+undefined undefined+lsh-->

2.自定义过滤器
2.1全局过滤器
必须放在new Vue()实例化前面,Vue.filter()

Vue.filter('cal', function (value, begin, xing) {
    return value + begin + xing;
});

2.2 注册在实例化内部
{{message | sum | currency }}

var myVue = new Vue({
    filters: {
      sum: function (value) {
          return value + 4;
       },
	}
});

九.组件基础

组件每用一次,就有一个新的实例被创建。此时该组件的data选项必须是一个函数,这样每个实例的数据就可以独立维护。
data: function () { return { count: 0 } }

在组件中使用v-for,使用v-bind动态传递prop。

解析 DOM 模板时的注意事项
有些 HTML 元素,诸如 <ul>、<ol>、<table> 和 <select>,对于哪些元素可以出现在其内部是有严格限制的。
而有些元素,诸如 <li>、<tr> 和 <option>,只能出现在其它某些特定的元素内部。

<table>
  <blog-post-row></blog-post-row>
</table>

这个自定义组件  会被作为无效的内容提升到外部,并导致最终渲染结果出错。
幸好这个特殊的 is 给了我们一个办法:解除了模板的限制元素

<table>
  <tr is="blog-post-row"></tr>
</table>
posted @ 2021-01-26 10:05  小韓烟柳  阅读(43)  评论(0)    收藏  举报