2018年7月

类名过渡

在进入/离开的过渡中,总共有6个累进行切换。

  1. v-enter:进入之前,元素的起始状态,此时还没有开始进入.这是一个时间点
  2. v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。即:入场动画的时间段.
  3. v-enter-to: 2.1.8版及以上 定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter 被移除),在过渡/动画完成之后移除。即:是动画离开之后,离开的终止状态,此时,元素动画已经结束了(这是一个时间点)
  4. v-leave: 定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。这是一个时间点.
  5. v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。
  6. v-leave-to: 2.1.8版及以上 定义离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave 被删除),在过渡/动画完成之后移除。

示例图:
transition.png

对于这些在过渡中切换的类名来说,如果你使用一个没有名字的 <transition>,则 v- 是这些类名的默认前缀。如果你使用了 <transition name="my-transition">,那么 v-enter 会替换为 my-transition-enter。也可以<transition name="my">修改前缀名字。
.v-move 和 .v-leave-active 配合使用,能够实现列表后续的元素,渐渐地漂上来的效果

注意:

  • 在实现列表过渡的时候,如果需要过渡的元素,是通过 v-for 循环渲染出来的,不能使用 transition 包裹,需要使用 transition-group.
    如果要为 v-for 循环创建的元素设置动画,必须为每一个 元素 设置 :key 属性.
  • ransition-group 添加 appear 属性,实现页面刚展示出来时候,入场时候的效果.
  • 通过 为 transition-group 元素,设置 tag 属性,指定 transition-group 渲染为指定的元素,如果不指定 tag 属性,默认,渲染为 span 标签
  • 示例:

       <transition-group appear tag="ul">
         <li v-for="(item, i) in list" :key="item.id" @click="del(i)">
           {{item.id}} --- {{item.name}}
         </li>
       </transition-group>

使用第三方CSS动画库

  1. 导入动画类库:

    <link rel="stylesheet" type="text/css" href="./lib/animate.css">

    2.定义 transition 及属性:

    <transition
      enter-active-class="fadeInRight"
      leave-active-class="fadeOutRight"
      :duration="{ enter: 500, leave: 800 }">
      <div class="animated" v-show="isshow">动画哦</div>
    </transition>

    使用 :duration="毫秒值" 来统一设置 入场 和 离场 时候的动画时长.
    :duration="{ enter: 200, leave: 400 }" 来分别设置 入场的时长 和 离场的时长

    使用钩子函数

  2. 定义 transition 组件以及三个钩子函数
    动画钩子函数的第一个参数:el,表示 要执行动画的那个DOM元素,是个原生的 JS DOM对象

    <div id="app">
     <input type="button" value="切换动画" @click="isshow = !isshow">
     <transition
     @before-enter="beforeEnter"
     @enter="enter"
     @after-enter="afterEnter">
       <div v-if="isshow" class="show">OK</div>
     </transition>
      </div>
    • beforeEnter 表示动画入场之前,此时,动画尚未开始,可以 在 beforeEnter 中,设置元素开始动画之前的起始样式.
  3. enter 表示动画 开始之后的样式,这里,可以设置小球完成动画之后的,结束状态.
  4. 动画完成之后,会调用 afterEnter
  5. 定义三个 methods 钩子方法:

    methods: {
         beforeEnter(el) { // 动画进入之前的回调
           el.style.transform = 'translateX(500px)';
         },
         enter(el, done) { // 动画进入完成时候的回调
           // 这句话,没有实际的作用,但是,如果不写,出不来动画效果;
           // 可以认为 el.offsetWidth 会强制动画刷新
           el.offsetWidth;
           el.style.transform = 'translateX(0px)';
           //这里的 done, 起始就是 afterEnter 这个函数,也就是说:done 是 afterEnter 函数的引用
           done();
         },
         afterEnter(el) { // 动画进入完成之后的回调
           this.isshow = !this.isshow;
         }
       }
  6. 定义动画过渡时长和样式

    .show{
       transition: all 0.4s ease;
     }

v-for的列表过渡

  1. 定义过渡样式

    <style>
    .list-enter,
    .list-leave-to {
      opacity: 0;
      transform: translateY(10px);
    }
    
    .list-enter-active,
    .list-leave-active {
      transition: all 0.3s ease;
    }
    </style>
  2. 定义DOM结构,其中,需要使用 transition-group 组件把v-for循环的列表包裹起来:

     <div id="app">
    <input type="text" v-model="txt" @keyup.enter="add">
    
    <transition-group tag="ul" name="list">
      <li v-for="(item, i) in list" :key="i">{{item}}</li>
    </transition-group>
     </div>
  3. 定义 VM中的结构

     var vm = new Vue({
      el: '#app',
      data: {
        txt: '',
        list: [1, 2, 3, 4]
      },
      methods: {
        add() {
          this.list.push(this.txt);
          this.txt = '';
        }
      }
    });

1.引入vue-resource

  <script src="./lib/vue-2.4.0.js"></script>
  <script src="./lib/vue-resource-1.3.4.js"></script>

注意:vue-resource依赖于 Vue,所以vue-resource一定要在Vue的后面。

方法列表:

  • get(url, [options])
  • head(url, [options])
  • delete(url, [options])
  • jsonp(url, [options])
  • post(url, [body], [options])
  • put(url, [body], [options])
  • patch(url, [body], [options])

选项:

参数类型描述
urlstring请求的目标URL
bodyObject, FormData, string作为请求体发送的数据
headersObject作为请求头部发送的头部对象
paramsObject作为URL参数的参数对象
methodstringHTTP方法 (例如GET,POST,...)
timeoutnumber请求超时(单位:毫秒) (0表示永不超时)
beforefunction(request)在请求发送之前修改请求的回调函数
progressfunction(event)用于处理上传进度的回调函数 ProgressEvent
credentialsboolean是否需要出示用于跨站点请求的凭据
emulateHTTPboolean是否需要通过设置X-HTTP-Method-Override头部并且以传统POST方式发送PUT,PATCH和DELETE请求。
emulateJSONboolean设置请求体的类型为application/x-www-form-urlencoded

响应:

通过如下属性和方法处理一个请求获取到的响应对象:

属性类型描述
urlstring响应的URL源
bodyObject, Blob, string响应体数据
headersHeader请求头部对象
okboolean当HTTP响应码为200到299之间的数值时该值为true
statusnumberHTTP响应吗
statusTextstringHTTP响应状态
方法类型描述
text()约定值以字符串方式返回响应体
json()约定值以格式化后的json对象方式返回响应体
blob()约定值以二进制Blob对象方式返回响应体

例子:
get请求:

this.$http.get('/get').then(function (result) {
            // 通过 result.body 拿到服务器返回的成功的数据
            // console.log(result.body)
          })

post请求:

this.$http.post('/post', {}, { emulateJSON: true }).then(result => {
            console.log(result.body)
          })

注意:通过 post 方法的第三个参数, { emulateJSON: true } 设置 提交的内容类型 为 普通表单数据格式

JSON请求

this.$http.jsonp('/jsonp').then(result => {
            console.log(result.body)
          })

定义:
全局的自定义指令:

Vue.directive('focus', {
  inserted: function (el) {
 
  }
})

私有的自定义属性:
组件中接受一个 directives 的选项:

directives: {
  focus: {
    inserted: function (el) {
      
    }
  }
}

调用:v-指令名

钩子函数
一个指令定义对象可以提供如下几个钩子函数 (均为可选):
bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。
componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
unbind:只调用一次,指令与元素解绑时调用。

钩子函数参数

指令钩子函数会被传入以下参数:
el:指令所绑定的元素,可以用来直接操作 DOM 。
binding:一个对象,包含以下属性:
name:指令名,不包括 v- 前缀。
value:指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2。
oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
expression:字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 "1 + 1"。
arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 "foo"。
modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }。
vnode:Vue 编译生成的虚拟节点。移步 VNode API 来了解更多详情。
oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
除了 el 之外,其它参数都应该是只读的,切勿进行修改。如果需要在钩子之间共享数据,建议通过元素的 dataset 来进行。

注意:自定义指令里面的样式样,只要通过指令绑定给了元素,不管这个元素有没有被插入到页面中去,这个元素肯定有了一个内联的样式。将来元素肯定会显示到页面中,这时候,浏览器的渲染引擎必然会解析样式,应用给这个元素。

这个 function 等同于 把 代码写到了 bind 和 update 中去

function (el, binding) {
         
}

函数详解:

  • 创建期间的生命周期函数

    • beforeCreate()表示的是实例创建之前就会调用改方法,在执行此函数的时候,data和methods中的数据还没有初始化。
    • created()在执行此方法的时候,data和methods中的数据已经初始化,所以,这里是最早可以调用methods里面的方法,和处理data中的数据的地方。
    • beforeMount()此时模板已经在内存中编辑完成了,但是还没有渲染到页面中。此时页面中的元素还没有真正的替换过来吗,还只是模板中的字符串。
    • mounted()内存中的模板已经挂载到了页面中了。用户已经可以看到渲染好的页面了。 mounted 是 实例创建期间的最后一个生命周期函数,当执行完 mounted 就表示,实例已经被完全创建好了,此时,如果没有其它操作的话,这个实例在内存中就不会在改变了。
  • 运行期间的生命周期函数

    • beforeUpdate()在执行此方法的时候,页面中的数据还没有发生改变,但是data中的数据已经发生了改变。
    • updated()页面中的数据和data中的数据全部是最新的了。
  • 销毁期间的生命周期函数:

    • beforeDestroy:实例销毁之前调用。在这一步,实例仍然完全可用。
    • destroyed:Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。

lifecycle1.png

Vue.js 允许你自定义过滤器,可被用作一些常见的文本格式化。过滤器可以用在两个地方:mustache 插值和 v-bind 表达式。过滤器应该被添加在 JavaScript 表达式的尾部,由“管道”符指示。

过滤器语法:Vue.filter('过滤器的名称', function(){})
过滤器中的 function ,第一个参数已经固定,永远都是过滤器管道符前面传递过来的数据。

私有过滤器

定义私有过滤器过滤器有两个条件:过滤器名称和处理函数
定义:

filters: {
  capitalize: function (value) {
    //函数体
  }
}

调用:
过滤器调用时候的格式 :{{ name | 过滤器1的名称| 过滤器2的名称 }}

<td>{{item.ctime | capitalize(value)}}</td>

全局过滤器

在创建 Vue 实例之前全局定义过滤器
定义

Vue.filter('capitalize', function (value) {
 //函数体
})

注意:当有局部和全局两个名称相同的过滤器时候,会以就近原则进行调用,即:局部过滤器优先于全局过滤器被调用!

简介

vue在小编看来就是一个很流行,很火的前端框架之一。那么官方怎么说的呢,我们一起看看:Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
说了这么多,小编还是不懂。不过接下来小编整理了一些经常用的东东。希望有所帮助。

使用

  1. 引入:首先引入你的vue.js.当我们导入包之后,在浏览器的内存中,就多了一个 Vue 构造函数。
  2. 使用:当 new 出来的这个 vm 对象,就是我们 MVVM中的 VM调度者。Vue 实例所控制的这个元素区域,就是MVVM的 V。
    示例:

    <div id="app">
     <p>{{ msg }}</p>
    </div>
    
    <script>
     var vm = new Vue({
         el:'#app',// 表示当前我们 new 的这个 Vue 实例,要控制页面上的哪个区域
         data:{// data 属性中,存放的是 el 中要用到的数据
             msg:'Hello World'
         }
     })
    </script>

    常用指令

  3. {{}}插值表达式。
  4. v-cloak解决未编译时期,显示未编译的代码,能够解决插值表达式闪烁的问题。这个指令保持在元素上直到关联实例结束编译。和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Mustache 标签直到实例准备完毕。
  5. v-text它会覆盖元素中原本的内容,但是插值表达式只会替换自己的这个占位符,不会把整个元素的内容清空。而且v-text没有闪烁问题。
  6. v-htmlv-text类似,但是v-html可以把html解析,然而v-text会把所有的值以字符串的形式输出,包括html。
  7. v-bind:简写为: 是 Vue中,提供的用于绑定属性的指令。可以写合法的JS表达式.
  8. v-on: 简写为:@事件绑定机制。为元素指定处理函数的时候,如果加了小括号,就可以给函数传参了
  9. v-model 指令,可以实现表单元素和 Model 中数据的双向数据绑定.v-model 只能运用在表单元素中。而v-bind 只能实现数据的单向绑定,从 M 自动绑定到 V, 无法实现数据的双向绑定。

事件修饰符

  • .stop 阻止冒泡。
  • .prevent 阻止默认行为。
  • .capture 实现捕获触发事件的机制。添加事件侦听器时使用事件捕获模式。
  • .self 只当事件在该元素本身(比如不是子元素)触发时触发回调。.self 只会阻止自己身上冒泡行为的触发,并不会真正阻止 冒泡的行为。
  • .once 只触发一次事件处理函数。

在Vue中使用样式

使用class样式

这些样式都需要使用v-bind做数据绑定.

  • 数组

     <h1 :class="['top','res']">我是h1</h1>
  • 三元表达式

    <h1 :class="['top','res', isactive?'active':'']">我是h1</h1>
  • 对象

    • 数组中的对象

      <h1 :class="['top','res', {'active': isactive}]">我是h1</h1>
    • 对象
    <h1 :class="{red:true, italic:true, active:true, thin:true}">我是h1</h1>

    注意:在为 class 使用 v-bind 绑定 对象的时候,对象的属性是类名,由于 对象的属性可带引号,也可不带引号; 属性的值是一个标识符。

使用内联样式

  1. 直接在元素上通过 :style 的形式,书写样式对象

     <h1 :style="{color: 'red', 'font-size': '40px'}">我是h1</h1>
  2. 将样式对象,定义到 data 中,并直接引用到 :style

       <h1 :style="[ styleObj1, styleObj2 ]">我是h1</h1>
       <h1 :style="styleObj1">这是一个h1</h1>

    在data上定义样式:

     data: {
             h1StyleObj: { color: 'red', 'font-size': '40px' },
             styleObj2: { 'font-style': 'italic' }
     }

    v-for、v-if、v-show

v-for

  • 迭代数组

    <li v-for="(item, i) in list">索引:{{i}} --- 姓名:{{item.name}} --- 年龄:{{item.age}}</li>
  • 迭代对象中的属性

    <div v-for="(val, key, i) in userInfo">{{val}} --- {{key}} --- {{i}}</div>
  • 迭代数字

    <p v-for="i in 10">这是第 {{i}} 个P标签</p>

    注意:2.2.0+ 的版本里,当在组件中使用 v-for 时,key 现在是必须的而且只接受 string / number数据类型。当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用 “就地复用” 策略。如果数据项的顺序被改变,Vue将不是移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key 属性。

     <p v-for="item in list" :key="item.id">
      <input type="checkbox">{{item.id}} --- {{item.name}}
     </p>

    v-if、v-show

  • v-if 的特点:每次都会重新删除或创建元素,有较高的切换性能消耗.
  • v-show 的特点: 每次不会重新进行DOM的删除和创建操作,只是切换了元素的 display:none 样式,有较高的初始渲染消耗.
  • 如果元素涉及到频繁的切换,最好不要使用 v-if, 而是推荐使用 v-show,如果元素可能永远也不会被显示出来被用户看到,则推荐使用 v-if 。

get

Express中有专门接受get请求参数的方法,该方法还可以直接将接受到的数据转换为json对象
实例代码

app.get('',function(req,res){
    var data = req.query)
})

post

在处理post请求的时候如果想拿到post请求过来的数据,必须借助一个中间件body-parser

第一步:安装

npm install body-parser

第二步:引入

var bodyParser = require('body-parser');

第三步:获取解析器

var urlencodedParser = bodyParser.urlencoded({ extended: false })

第一步:安装

npm install --save art-template
npm install --save express-art-template

第二步:指定.html使用的解析引擎(官方给出的是art,自己开心就好)

app.engine('html', require('express-art-template'))

第三步:使用模板进行传值

app.get('/', function (req, res) {
    res.render('index.art', {
        user: {
            name: 'aui',
            tags: ['art', 'template', 'nodejs']
        }
    });
});

附录:官方示例

var express = require('express');
var app = express();
app.engine('art', require('express-art-template'));
app.set('view options', {
    debug: process.env.NODE_ENV !== 'production'
});

app.get('/', function (req, res) {
    res.render('index.art', {
        user: {
            name: 'aui',
            tags: ['art', 'template', 'nodejs']
        }
    });
});

小编在使用node的时候,在执行了npm init之后出现找不到C:\Program Files\nodejs\node_modules\npm\bin\node_modules\npm\bin\npm-cli.js这个文件的错误,然后执行npm -v无解,还是出现同样的错误,对于刚刚接触node的小编来说真不知道怎么办了,简单粗暴点吧,卸载,重装。。。。。。结果依旧是悲剧的,打开之后还是不行,还是同样的错误。小编看了下的确没有这个文件,上网找了找解决方案,由于小编技术不好,没有找到。小编心想使用了这么多天都没出现问题,突然就不能使用了呢,会不会是系统原因,要不重启下吧,重启之后,小编发现还真可以使用了。虽然不知道为什么,但是问题解决了,希望知道原因的小伙伴告诉小编一下吧。

解决办法:重装重启电脑
很遗憾的告诉大家,小编重装系统了,又遇到了相同的问题,没有解决,解决的小伙伴,麻烦告诉下小编。
1.png

scandir函数

  1. scandir() 函数返回指定目录中的文件和目录的数组。
  2. 语法:scandir(directory,sorting_order,context);
  3. |参数 |描述|
    |--|--|
    | directory | 必需。规定要扫描的目录。 |
    | sorting_order |可选。规定排列顺序。默认是 0,表示按字母升序排列。如果设置为 SCANDIR_SORT_DESCENDING 或者 1,则表示按字母降序排列。如果设置为 SCANDIR_SORT_NONE,则返回未排列的结果。 |
    | context |可选。规定目录句柄的环境。context 是可修改目录流的行为的一套选项。 |

LNMP开启scandir函数

scandir函数在linux中风险较大,所以我们一般在linux操作系统中直接禁止次函数。但是小编在安装最新版的handsome主题的时候,发现图片不能够随机显示,最后问了问开发者,发现自己的scandir函数没有开启,小编采用的是LAMP的环境,所以开启也很简单。
在linux控制台执行以下命令即可:

sed -i 's/,scandir//g' /usr/local/php/etc/php.ini

然后重启lnmp

lnmp restart

2.png