axiosvueJavaScript 进阶营

VUE音乐播放器学习笔记(1)- ( JSONP ) + ( 插

2017-09-21  本文已影响253人  woow_wu7

(1) babel-polyfill

cnpm install babel-polyfill --save-dev
在入口文件main.js中

1.require("babel-polyfill");      // es5
2.import "babel-polyfill";        // es6,写在main.js的最开始位置
3.module.exports = {
  entry: ["babel-polyfill", "./app/js"]
};

注:第三种方法适用于使用webpack构建的同学,加入到webpack配置文件(webpack.config.js)entry项中

ps: ( polyfill是补丁的意思 )

(2) babel-runtime 作用和babel-polyfill类似,能够使用es6的api

cnpm install babel-runtime --save         // 这里是--save,用在线上环境

(3) fastclick 解决移动端点击 300ms 延迟

cnpm install fastclick --save             // 这里是--save,用在线上环境
在入口文件main.js中

import fastclick from ' fastclick '
fastclick.attach(document.body)

(4) 两种方法实现,默认跳转到指定的路由页面

(1) router.push('/路由地址')使用方法


在main.js中:
router.push('/recommend')

-------------------------------------------------------------------


(2) redirect ( 跟路由重定向 ) 使用方法


在router/index.js路由入口页面中:

export default new Router({
  routes: [
    { path: '/', name: 'home', redirect: '/recommend' },   // 根路由重定向,会记住路由路径
    { path: '/recommend', name: 'recommend', component: Recommend },
    { path: '/singer', name: 'singer', component: Singer }
    { path: '/rank', name: 'rank', component: Rank },
    { path: '/search', name: 'search', component: Search },
  ]
})





(5) jsonp

(1) ( webmodules/jsonp )

cnpm install jsonp --save
jsonp(url, options, fn)    // 现在基本用promise结构了
jsonp(url, options, (err, data) => { })
url : ( String ) 请求地址
opts : ( Object ) 有如下选项:
    param ( String ) 参数,默认是一个回调函数。和 后端约定的字段参数名   **
    timeout ( Number ) 超时时间,默认1分钟后。  **
    prefix ( String )  callback等于什么,在前面加个前缀。默认 __jp 
    name ( String )
fn callback回调函数,很少用回调,es6中基本用封装promise方法

(2) promise


var promise = new Promise(function(resolve, reject) {

    // 异步处理
    // 处理结束后、调用resolve 或 reject

    // resolve 成功时候的回调
    // reject 失败时候的回调
});

 _getData() {
         return new Promise((resolve, reject) => {
            Jsonp('https://c.y.qq.com/musichall/fcgi-bin/fcg_yqqhomepagerecommend.fcg?g_tk=5381&uin=0&format=json&inCharset=utf-8&outCharset=utf-8&notice=0&platform=h5&needNewCode=1&_=1505661043507', {param: 'jsonpCallback'}, (err, data) => {
              if (!err) {
                resolve(data)
                console.log(data)
              } else {
                reject(err)
              }
            })
          })
      }

(3) for in循环

for...in 语句用于对数组或者对象的属性进行循环操作。

与for循环的区别:
for循环是对数组的元素进行循环,而不能用于非数组对象。


for (变量 in 对象)
{
    在此执行代码
}
---------------------------------------------------

遇到数组时key为数据下标 ,遇到对象时 key为对象(名称:值)项的名称。

  for (var k in data) {
    let value = data[k] !== undefined ? data[k] : ''
    url += '&' + k + '=' + encodeURIComponent(value)   // 这里的k不是下标(数字),而是key:value中的key
  }




(4) encodeURIComponent( URIstring )

encodeURIComponent(URIstring) 函数可把字符串作为 URI 组件进行编码。

<script type="text/javascript">

document.write(encodeURIComponent("http://www.w3school.com.cn"))
document.write("<br />")
document.write(encodeURIComponent("http://www.w3school.com.cn/p 1/"))
document.write("<br />")
document.write(encodeURIComponent(",/?:@&=+$#"))

</script>
---------------------------------------

输出:
http%3A%2F%2Fwww.w3school.com.cn
http%3A%2F%2Fwww.w3school.com.cn%2Fp%201%2F
%2C%2F%3F%3A%40%26%3D%2B%24%23

http://www.w3school.com.cn/jsref/jsref_encodeURIComponent.asp

(5) stringObject.substring( start, stop )

<html>
<body>

<script type="text/javascript">

var str="Helloworld!"

document.write(str.substring(3,7))

</script>

</body>
</html>
---------------------------------------------

输出结果:
lowo 

(6) stringObject.indexOf(searchvalue,fromindex)

<script type="text/javascript">

var str="Hello world!"
document.write(str.indexOf("Hello") + "<br />")
document.write(str.indexOf("World") + "<br />")    // 这个W是大写的
document.write(str.indexOf("world"))

</script>
----------------------------------------------


输出结果:

0
-1
6

(7) Object.assign( target, ...sources )

复制一个 object

var obj = { a: 1 };
var copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }

--------------------------------

合并 objects

var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };

var obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1);  // { a: 1, b: 2, c: 3 }, 注意目标对象自身也会改变。


  const data = Object.assign({}, commonParams, {       // 把commonParams和{}一起复制给data
    platform: 'yqq',     
    hostUin: 0,
    sin: 0,
    ein: 29,
    sortId: 5,
    needNewCode: 0,
    categoryId: 10000000,
    rnd: Math.random(),
    format: 'json'
  })


  export default {
    data() {
      return {
        aa: {爱好: '代码'}
      }
    },
    created() {
      this.getArray()
    },
    methods: {
      getArray() {
        const bb = Object.assign({}, {姓名: '张三', 年龄: '20', 性别: '男'}, this.aa)
        console.log(bb)
      }
    }
  }

输出结果:Object {姓名: "张三", 年龄: "20", 性别: "男", 爱好: "代码"}

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

(6) 插槽 < slot > 与 内容分发

父组件


<div>
  <h1>我是父组件的标题</h1>
  <my-component>                           // 子组件
    <p>这是一些初始内容</p>
    <p>这是更多的初始内容</p>
  </my-component>
</div>

-----------------------------------------------------------

子组件 my-component 


<div>
  <h2>我是子组件的标题</h2>
  <slot>
    只有在没有要分发的内容时才会显示。            // 备用内容,只有在没有要分发的内容时才会显示 
  </slot>                                      // 备用内容在子组件的作用域内编译
</div>
------------------------------------------------------------

渲染结果:

<div>
  <h1>我是父组件的标题</h1>                   // 父组件自己的内容
  <div>
    <h2>我是子组件的标题</h2>                 // 子组件自己的内容
    <p>这是一些初始内容</p>                   // 以下是插槽分发的内容
    <p>这是更多的初始内容</p>
  </div>
</div>

 
 父组件模板的内容在父组件作用域内编译;子组件模板的内容在子组件作用域内编译。

(6) 具名插槽 < slot name="xxx" >

父组件



<app-layout>
  <h1 slot="header">这里可能是一个页面标题</h1>

  <p>主要内容的一个段落。</p>
  <p>另一个主要段落。</p>

  <p slot="footer">这里有一些联系信息</p>
</app-layout>

-----------------------------------------------------

子组件


<div class="container">
  <header>
    <slot name="header"></slot>                // 该具名插槽,将匹配父组件中slot="header"中的内容
  </header>
  <main>
    <slot></slot>
  </main>
  <footer>
    <slot name="footer"></slot>                // 该具名插槽,将匹配父组件中slot="footer"中的内容
  </footer>
</div>

(7) Access control allow origin 访问控制允许同源

Access control allow origin 报错

main.js

import axios from 'axios'
Vue.prototype.$http = axios


// prototype属性 : 使您有能力向对象添加属性和方法。

// prototype是原型的意思
---------------------------------------------------------------------------------

recommend.vue

  dataImage() {   // 百度图片线上接口
           this.$http.get('http://image.baidu.com/channel/listjson?pn=15&rn=30&tag1=%E7%BE%8E%E5%A5%B3&tag2=%E5%85%A8%E9%83%A8&ie=utf8')
            .then((response) => {
               console.log(response)
            })
        }

(8) 轮播图

(1) 滚动的图片

<template>
  <div class="slider" ref="slider">
    <div class="slider-group" ref="sliderGroup">
      <slot name="slider">
      </slot>
    </div>
    <div class="dots">
    </div>
  </div>
</template>
--------------------------------------------------------------------------
      methods: {
          _setSliderWidth() {
            this.children = this.$refs.sliderGroup.children     // 拿到sliderGroup的子元素
            let width = 0
            let sliderWidth = this.$refs.slider.clientWidth      // 拿到slider的宽度
            for (let i = 0; i < this.children.length; i++) {
                let child = this.children[i]      // 每一个子元素
                addClass(child, 'slider-item')    // 给每一个子元素添加名为'slider-item'的class

                child.style.width = sliderWidth + 'px'    // 每一个子元素的宽度和计算得到的父元素的宽度相同
                width += sliderWidth     // sliderGroup的总宽度
            }
            if (this.loop) {
                width += sliderWidth * 2
            }
            this.$refs.sliderGroup.style.width = width + 'px'      // sliderGroup的总宽度
          },
          _initSlider() {
            this.slider = new BScroll(this.$refs.slider, {       // 获取释口dom
                scrollX: true,
                scrollY: false,
                momentum: true,  // 惯性
                snap: true,     // 用户slider的属性
                snpaLoop: this.loop,
                snapThreshold: 0.3,
                snpaSpeed: 400,
                click: true
            })
          }
      }

(2) 滚动图片的dots

1. scrollEnd() 事件
2. getCurrentPage() 方法
3.goToPage(x, y, time, easing)

参数
{Number} x 横轴的页数
{Number} y 纵轴的页数
{Number} time 动画执行的时间
{Object} easing 缓动函数,一般不建议修改,如果想修改,参考源码中的 ease.js 里的写法
返回值:无
作用:当我们做 slide 组件的时候,slide 通常会分成多个页面。调用此方法可以滚动到指定的页面。

_initSlider() {
            this.slider = new BScroll(this.$refs.slider, {
                scrollX: true,
                scrollY: false,
                momentum: false,  // 惯性,物理学的动量
                snap: true,     // 用于slider
                snpaLoop: this.loop,
                snapThreshold: 0.3,
                snpaSpeed: 400,
                click: true
            })
            this.slider.on('scrollEnd', () => {      // 在滑动结束时触发事件
                let pageIndex = this.slider.getCurrentPage().pageX   // 得到当前的index
                if (this.loop) {
                    pageIndex -= 1
                }
                this.currentPageIndex = pageIndex
            })
          }
  _initDots() {     // dots的数量
            this.dots = new Array(this.$refs.sliderGroup.children.length)    // 长度为5的空数组
          }

-------------------------------------------------------------------

<div class="dots">
      <span v-for="(item,index) in dots"    // 循环dots
            class="dot"    // 每个dot的class
            v-bind:class="{'active': currentPageIndex === index }">    // 当前的dot的class
      </span>
</div>

(9) keep-alive

<keep-alive></keep-alive>

如果把切换出去的组件保留在内存中,可以保留它的状态或避免重新渲染。也不会重新请求数据,为此可以添加一个 keep-alive 指令参数:

include 和 exclude 属性允许组件有条件地缓存。二者都可以用逗号分隔字符串、正则表达式或一个数组来表示:

include - 字符串或正则表达式。只有匹配的组件会被缓存。
exclude - 字符串或正则表达式。任何匹配的组件都不会被缓存。

<keep-alive>
  <component :is="currentView">
    <!-- 非活动组件将被缓存! -->
  </component>
</keep-alive>
--------------------------------------------------------------

实例:

  <keep-alive>
      <router-view></router-view>
  </keep-alive>

---------------------------------------------------------------

新增:

<!-- 逗号分隔字符串 -->
<keep-alive include="a,b">
  <component :is="view"></component>
</keep-alive>

<!-- 正则表达式 (使用 `v-bind`) -->
<keep-alive :include="/a|b/">
  <component :is="view"></component>
</keep-alive>

<!-- 数组 (使用 `v-bind`) -->
<keep-alive :include="['a', 'b']">
  <component :is="view"></component>
</keep-alive>

(10) destroyed生命周期钩子

Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。

(11) axios之服务器端的请求

(11) express Router的使用

(11) 前端不能直接修改request headers,所以需要使用后端代理:原理是,前端请求的url地址,不是直接请求别的网站地址,而是自己的server端 ( 后端路由给的地址),然后由后端再去请求别的网站地址。

1. referer 请求的来源

上一篇 下一篇

猜你喜欢

热点阅读