vue 框架级数据请求 axios(第三方库) fetch(原生) 侦听属性watch 混入mixins

框架级的数据请求

  1. axios ( 第三方库 — 别人封装好的库 ) (重点)

    注意:在使用axios之前要引用axios.js文件


案例:

1.对json数据进行请求

new Vue({ el: '#app', methods: { getData () { //进行get请求 // axios.get() -- $.get() // axios.post() ---$.post() // axios(options) -- $.ajax(options) // var p = axios({ // url: './data/data.json' // }) // console.log( p ) Promise对象 axios({ url: './data/data.json', method: 'get',//默认就是get请求 }) .then( res => console.log( res )) .catch( error => conosle.log( error )) } }

2.对对本地php文件进行请求数据(跨域 要在php文件中设置请求头)

new Vue({ el: '#app', methods: { get_myself_php_data () { axios({ url: 'http://localhost/get.php', params: { a: 1, b: 2 } }) .then( res => console.log( res )) .catch( error => console.log( error )) } }

3.跨域请求线上数据(卖座网 https://m.maizuo.com/v5/#/films/nowPlaying)

new Vue({ el: '#app', methods: { get_be_data () { // 跨域请求线上数据 - 卖座 axios({ url: 'https://m.maizuo.com/gateway', headers: { 'X-Client-Info': '{"a":"3000","ch":"1002","v":"5.0.4","e":"154549400038873748996477"}', 'X-Host': 'mall.film-ticket.film.list' },// 要设置请求头 params: { cityId: 330100, pageNum: 1, pageSize: 10, type: 1, k: 7675918 }// params为请求的数据 }) .then( res => console.log( res )) .catch( error => console.log( error )) } }

4.post请求数据


new Vue({ el: '#app', methods: { postData () { /* post请求官网案例有些问题 axios({ url: 'http://localhost/post.php', method: 'post', data: { a: 2, b: 2 } }) .then( res => console.log( res )) .catch( error => console.log( error ))// 以上是请求不到数据的 */ var params = new URLSearchParams() //得到params对象,用来接收参数 // params.append( key, value ) key就是参数名,value就是参数值 params.append( 'a', 2 ) params.append( 'b', 2 ) axios({ url: 'http://localhost/post.php', method: 'post', headers: { 'Content-Type': "application/x-www-form-urlencoded" //请求头设置为表单提交的请求头 }, data: params }) .then( res => console.log( res )) .catch( error => console.log( error )) } } })

fetch ( javascript 原生提供 )(重点)

fetch是原生javascript提供的 , 所以它 可以当做全局变量使用 ,它是挂载在window对象身上的

  • fetch要手动进行一次数据格式化,但是axios是内部进行了数据的格式化

  • fetch get 方法请求数据,参数要直接连接在url上

  • fetch 格式化数据 有三种 处理方法
    . json() 格式化 json 类型数据, 将 json类型 string 转换成 json 对象
    text() 格式化文本
    . blob() 格式化二进制数据

  • fetch 如果按照官网文档书写post请求,携带数据出现了问题

  • fetch post处理

    设置请求头

    通过 new URLSearchPrams 来携带参数

    案例:

  1. fetch的get请求方法
new Vue({ el: '#app', methods: { getData() { fetch('../data/data.json') .then(res => res.json()) //先对数据格式化 .then(data => console.log(data)) //这里的data就是格式化后的数据 .catch(error => console.log(error)) } } })

2.fetch的post请求数据方法

new Vue({ el: '#app', methods: { postData() { fetch('http://localhost:8080//h5-1903/123/post.php', { method: 'post', headers: new Headers({ 'Content-Type': 'application/x-www-form-urlencoded' // 指定提交方式为表单提交 }), body: new URLSearchParams([ ["a", 1], ["b", 5] ]).toString() }) .then(res => res.text()) .then(data => console.log(data)) .catch(error => console.log(error)) } } })

3.vue这边的数据请求的发展

  • vue-resource ( Vue 以前自己封装使用的请求类库 ) ,但是 vue-resource作者已经放弃更新了
  • vue-resource 作者推荐我们使用 axios
  • vue-resource 用法 和 axios 相似度 90% +
  • vue2.0我们基本上使用的都是 fetch / axios
  • vue-resource 是有jsonp的
  • vue-resource 如果在vue中使用,是挂载当前的 实例( 组件 ) 的$http属性身上的

举例 this. h t t p ( o p t i o n s ) t h i s . http( options ) this. http(options)this.http.get() this.$http.post

参考文档:
    数据交互:
    vue-resource   下载安装引入   vue1.x 推荐    支持jsonp
        使用:    返回的是promise对象
        this.$http.get('url地址?key=value&key=value').then(succFN,errorFn)
        this.$http.get('url地址',{配置}).then(succFN,errorFn)
        this.$http.post('url地址',{数据},{配置}).then(succFN,errorFn)
        this.$http.jsonp('url地址',{配置}).then(succFN,errorFn)
            params:{ //携带参数
                wd:'bulala'
              },
            jsonp:'cb', //约束回调函数的key,
            jsonpCallback:'show',//回调函数名

            请求:
                body: post需要携带的数据
                    支持string  a=1&b=2
                    对象<需要设置emulateJSON:true>
                    URLSearchParams 类型 new Xxx() -> x.set(key,value)
                params: {key:value}  携带数据  get
                headers: {}  携带请求头
                method:'get' get/post/.....   string
                timeout: number  超时
                progress:fn   进度
                credentials: false  是否携带跨源凭证
                emulateJSON:true post请求是需要携带的请求头
                jsonp:'回调函数键' 默认是callback
            响应:
                body      返回的数据  对象  (JSONP.parse)
                bodyText  返回的数据  文本格式  toString

    axios    下载安装引入    vue2.x只有推荐        支持jsonp ??

        axios({
            url: 地址
            method: 提交方法   get/post/put........
            params: get提交参数
            data: post提交参数  参数==URLSearchParams  new URLSearchParams().set(key,value)
            timeout:超时间
            headers: 请求头
        })
    拦截器  interceptor
        在  then   和 catch 之前我们想做的事
------------------------------------------------------------
    axios    下载安装引入    vue2.x推荐        支持jsonp ?? proxyTable/proxy
        希望可以this.$http 去使用axios,需要 配置: Vue.prototype.$http=axios;

        this.$http|axios({配置}).then(成功回调(res)).catch(失败回调(res))
        this.$http|axios.get(url,{配置}).then(成功回调(res)).catch(失败回调(res))
        this.$http|axios.post(url,pollfill).then(成功回调(res)).catch(失败回调(res))

        post请求:
            pollfill = new URLSearchParams() -> params.append('a', 111);
            this.$http|axios.post(url,pollfill).then(成功回调(res)).catch(失败回调(res))

            this.$http|axios({
                url:'',
                method:'post',
                data:pollfill
            })

        配置:
            url:'' 地址
            method: '' 提交姿势
            params:{} get提交的数据
            data:{} post提交数据
        res:
            data:  数据
  1. axios 和 fetch 没有jsonp 数据请求类型的
  • axios 和 fetch 都是promise

  • axios会对我们请求来的结果进行再一次的封装( 让安全性提高 )

侦听属性watch

  1. 作用

用来监听data中定义的数据,当data中定义的数据发生了变化,那么watch中的key就会触发
watch是一个对象
watch: {}
watch中可以设置多个类型的键值

  1. 使用方式( 重点 )

方法
watch: {
fn () {}
}

案例:在输入框中输入姓和名 全名将会在下一个输入框中显示

new Vue({ el: '#app', data: { firstName: '', lastName: '', fullName: '' }, watch: { //1. watch中可以设置方法,方法名就是data中的 key firstName ( val ) { console.log( val ) //改变后的值 this.fullName = val + this.lastName }, lastName ( val ) { this.fullName = this.firstName + val } } })

对象: ( 深度监听 )
watch: {
fn: {
handler(){},
deep: true
}
}

案例:

new Vue({ el: '#app', data: { firstName: '', lastName: '', fullName: '', name: { xiaoming: { xiaoming: { xiaoming: 'xiaomign' } } } }, watch: { //1. watch中可以设置方法,方法名就是data中的 key firstName ( val ) { console.log( val ) //改变后的值 this.fullName = val + this.lastName }, lastName: { handler ( val ) { //处理程序 this.fullName = this.firstName + val }, deep: true } } })

计算属性

使用方式

1.里面存放方法

computed: {
fn () {
return ‘’ //必须要有返回值
}
}

用计算属性写上面的案例:

new Vue({ el: '#app', data: { firstName: '', lastName: '', }, computed: { fullName () { return this.firstName + this.lastName } } })

2.里面存放对象

computed: {
newName: {
get () {
return ‘’ //get里面要有return
},
set ( val ) { //val就是修改后的值
}
}
}

new Vue({ el: '#app', data: { FirstName: '', LastName: '', vals: '', }, computed: { FullName: { get() { return this.FirstName + this.LastName }, set(val) { // val是数据改变之后的值 this.FirstName = val.slice(0, 1); // 截取姓氏 this.LastName = val.slice(1) // 截取名字 } } } })

注意: 上面的get,set我们统一起了个名字叫做: 存储器,别人也叫getter/setter
get set 这两者, 对象中有,类里面也有
get set 是计算属性的 这个理解是错的

watch vs computed(重点)

  1. watch是用来监听某一个数据的,当数据发生改变是,watch就会自动触发,然后我们可以进行一些任务

  2. computed是为了暴露一个全局变量,这个全局变量是经由一定逻辑产生的

  3. 什么时候选择 watch ? 什么是选择 computed ? 什么时候选择 methods?

    • 数据量较大,并且有异步操作我们选择 watch 应用场景: 上拉加载,下拉刷新
    • computd的使用满足两个就可以了
      暴露一个类似全局变量的数据
      可以进行逻辑的处理
    • methods的使用: 事件程序程序 ( 用户交互 )

混入mixins

实际意义:将组件的选项抽离出去,单独管理,复用
两种使用形式:
局部混入
全局混入

原理

  1. 数据驱动

当数据发生改变时,视图也会进行更新,这叫做数据驱动,也就是数据驱动视图

  1. 深入响应式原理

数据模型仅仅是普通的 JavaScript 对象。而当你修改它们时,视图会进行更新

  1. 双向数据绑定原理

当我们使用 v-model 指令绑定了表单元素时,那么我们可以在视图直接获得数据,当视图发生改变时,数据也会进行更新
综上: 三者都是应用了同一个底层原理,这个底层原理由es5的 Object.defineProperty 属性来提供

4.vue中底层原理的实现主要是依赖 存储器( getter/setter )

我们利用了数据劫持和事件的发布订阅来实现双向数据绑定,当我们在vue data选项中定义数据时,vue会通过观察者对象( observer )将data选项中的所有key,经过Object.defineProperty 的getter 和setter进行设置,当我们通过 v-model指令绑定元素是, 自动触发getter,getter会返回一个初始值,这样我们在视图中就可以看到数据了,当视图中内容改变时,会触发setter,setter会通知vue,视图已经进行了更新,vue会重新生成 虚拟DOM , 继而通过 新旧 虚拟DOM 对比, 生成patch对象,再将patch对应渲染到视图中

Object.defineProperty( obj, attr, options )

obj: 指的是要监听的对象
attr: 是这个对象身上的属性
options: 是对这个对象的属性的配置
核心:是否可读 是否可遍历( 枚举 )
存储器:get set

Vue.set/this.$set 的原理( 数组的下标和length不响应 )

底层:Object.assign

案例:进行对象的合并

var obj1 = {
name1: 'zhangsan',
id: 1,
age: 18
}
var obj2 = {
name2: '123'
}

var obj3 = Object.assign({}, obj1, obj2) //进行对象合并的

console.log(obj3) // {name1: "zhangsan", id: 1, age: 18, name2: "123"}

console.log(Object.keys(obj1)) // ["name1", "id", "age"]
console.log(Object.values(obj1)) // ["zhangsan", 1, 18]

你可能感兴趣的:(vue 框架级数据请求 axios(第三方库) fetch(原生) 侦听属性watch 混入mixins)