框架级数据请求

框架级数据请求

  1. axios( 第三方库,别人封装好的)

  2. fetch ( javascript 原生提供的)

  3. vue数据请求发展

  • vue-resource( vue以前自己封装使用的数据请求类库),倒是作者放弃更新了

  • vue-resource作者推荐我们使用axios

  • vue-resource用法和axios相似

  • 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

4.fetch/axios没有jsonp数据请求类型(在框架及数据请求基本上不会使用jsonp)

​ 1).都是promise

​ 2).axios会对我们请求结果经行再一次封装(增加了安全性)

​ 3) 例get请求(前端mock数据):

当我们全局引入一个axios时就会暴露一个全局axios对象

<body>
    <div id="app">
        <button @click=“getData”>
            
        </button>
        <button  @click=“posttData”>>
            
        </button>
    </div>
</body>
<script>
  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',//在目录下建一个data.josn的文件
            method: 'get',//默认就是get请求
          })
            .then( res => console.log( res ))//得到结果
            .catch( error => conosle.log( error ))//抛错
  

        },
        
      }
    })
</script>

4).案例:

Font end==FE 前端

Back end==BE 后端

前端跨域是反向代理jsonp

在线跨域请求,后端跨域请求

<?php
    
    header('Access-Control-Allow-Origin:*')
    $a=$_['a']
    $b=$_['b']
    echo $a+$b
    ?>
<body>
  <div id="app">
   
    <button @click = "get_be_data"> get - backend online- api </button>
    <button @click = "get_myself_php_data"> get - myself - php -api </button>
   
      
  </div>
</body>
<script>
	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 ))
      },
        //请求一段在线地址,携带了请求头
      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
          }
        })  
          .then( res => console.log( res ))
          .catch( error => console.log( error ))

      },
     
    }
  })
</script>

5)post请求方法:

先设置请求头=》传参数——》URLSearchParams——》 params.append——》url

<body>
     <button @click = "postData"> post </button>
</body>
<script>
	new Vue({
        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 ))
      }
    }
  })
        }
    })
</script>

watch

1.作用

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

2.使用方式

  • 方法:

      watch: {
          fn () {}
        }
    
  • 对象(监听)

    watch: {
          fn: {
            handler(){},
            deep: true
          }
        }
    
    ## 计算属性
    1. 使用方式
        - 里面存放方法
        ```javascript
          computed: {
            fn () {
              return ''   //必须要有返回值
            }
          }
    
    - 里面存放对象
    ​```javascript
      computed: {
        newName: {
          get () {
            return '' //get里面要有return
          },
          set ( val ) { //val就是修改后的值
    
          }
        }
      }
    ​```
    - 注意: 上面的get,set我们统一起了个名字叫做: 存储器,别人也叫getter/setter
    - get set 这两者, 对象中有,类里面也有
    - **get set 是计算属性的    这个理解是错的**
    

watch vs computed

  1. watch是用来监听某一个数据的,当数据发生改变是,watch就会自动触发,然后我们可以进行一些任务
  2. computed是为了暴露一个全局变量,这个全局变量是经由一定逻辑产生的
  3. 什么时候选择 watch ? 什么是选择 computed ? 什么时候选择 methods?
  • 数据量较大,并且有异步操作我们选择 watch 应用场景: 上拉加载,下拉刷新
  • computd的使用满足两个就可以了
    • 暴露一个类似全局变量的数据
    • 可以进行逻辑的处理
  • methods的使用: 事件程序程序 ( 用户交互 )

------------------------------------ 混入 mixins ----------------------------

mixins ( 青铜 )

实际意义:将组件的选项抽离出去,单独管理,复用

  • 有两种使用形式
    • 局部混入
    • 全局混入

原理( 王者 )

  1. 数据驱动
    当数据发生改变时,视图也会进行更新,这叫做数据驱动,也就是数据驱动视图
  2. 深入响应式原理
    数据模型仅仅是普通的 JavaScript 对象。而当你修改它们时,视图会进行更新
  3. 双向数据绑定原理
    当我们使用 v-model 指令绑定了表单元素时,那么我们可以在视图直接获得数据,当视图发生改变时,数据也会进行更新

综上: 三者都是应用了同一个底层原理,这个底层原理由es5的 Object.defineProperty 属性来提供

  • 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对应渲染到视图中

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

底层:Object.assign

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值