2020-06-18 Vue

自定义指令

  • 通过vue来封装指令(directive),从而去扩展标签原本的功能。

语法:

  • 全局指令
    • 语法:Vue.directive(指令名称,指令的配置对象)
    • 指令名称:定义的时候不需要v-,但是使用的时候加上v-
    • 指令的配置对象:{inserted(el){}} 等使用该指令的元素渲染完毕后(dom生成后)执行
      • 在dom生成后才可为该dom扩展功能
      • el 就是使用指令的dom对象
  • 局部指令
    • 语法:new Vue({directives:{指令名称:指令的配置对象,...}})
    • 指令名称:定义的时候不需要v-,但是使用的时候加上v-
    • 指令的配置对象:{inserted(el){}} 等使用该指令的元素渲染完毕后(dom生成后)执行
      • 在dom生成后才可为该dom扩展功能
      • el 就是使用指令的dom对象

代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title></title>
  </head>
  <body>
    <div id="app">
      <!-- 需求:v-focus指令来为该input标签实现自动获取焦点功能 -->
      <input type="text" v-focus="{h:100,w:100}">
    </div>
    <script src="./vue.js"></script>
    <script>
      // 全局指令
      // Vue.directive('focus',{
      //   // inserted 函数使用该指令的元素渲染完毕后执行
      //   inserted (el) {
      //     // el 使用该指令的DOM
      //     // 获取焦点
      //     // 对dom扩展任意功能
      //     el.style.height = '200px'
      //     el.focus()
      //   }
      // })

      const vm = new Vue({
        el: '#app',
        data: {},
        methods: {},
        // 局部 定义自定义指令
        directives: {
          // 属性名:指令的名称
          // 属性值:指令配置对象
          focus: {
            inserted (el, binding) {
              // binding 指令的信息对象
              // 其中有一个 value 就是指令的值
              el.style.width = binding.value.w + 'px'
              el.style.height = binding.value.h + 'px'
              el.focus()
            }
          }
        }
      })
    </script>
  </body>
</html>

补充:

  • 指令的参数怎么接收 inserted(el,binding){} binding就是指令信息

计算属性

作用:

  • 根据data当中的数据,经过一定的逻辑处理,得到一项新数据(计算属性)。
  • 当data中的数据发生变化的时候,计算属性也会更新。
  • 计算属性也是响应式数据,改变的时候也会驱动视图的更新。
  • 当多次获取计算属性的时候,处理逻辑不会重新执行,因为有缓存。

定义:

  • 语法:new Vue({computed:{ 书写计算属性 }})
  • 书写计算属性:
    • myMsg () { // 处理逻辑 return ‘处理后的数据’ }
  • 使用:和data中的数据一致

代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title></title>
  </head>
  <body>
    <div id="app">
      <h1>{{message}}</h1>
      <!-- 逻辑复杂,可读性差,违背初心(使用简单的js表达式) -->
      <h1>{{ message.split('').reverse().join('') }}</h1>
      <!-- 通过计算属性来优化 -->
      <hr>
      <h1>{{reverseMsg}}</h1>
    </div>
    <script src="./vue.js"></script>
    <script>
      const vm = new Vue({
        el: '#app',
        // 数据
        data: {
          message: 'hi vue'
        },
        methods: {},
        // vue的配置选项:computed
        // 计算属性
        computed: {
          // 属性名 计算属性的名称
          // 属性值 计算属性的处理函数
          // reverseMsg : function () {
          reverseMsg () {
            // 依赖data中的数据,进行一定的逻辑处理,得到一个新数据
            const newMsg = this.message.split('').reverse().join('')
            // 必须将新数据返回出去
            return newMsg
          }
          // reverseMsg 就是数据名称,在模板中使用data中数据一致
        }
      })
    </script>
  </body>
</html>

总结:

  • 使用场景:当你依赖data里面的数据,经过较为复杂的逻辑处理,得到一个新的数据,此时可以使用计算属性来实现。

computed和methods区别

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title></title>
  </head>
  <body>
    <div id="app">
      <h1>{{reverseFn()}}</h1>
      <h1>{{reverseFn()}}</h1>
      <h1>{{reverseFn()}}</h1>
      <h1>{{reverseMsg}}</h1>
      <h1>{{reverseMsg}}</h1>
      <h1>{{reverseMsg}}</h1>
    </div>
    <script src="./vue.js"></script>
    <script>
      const vm = new Vue({
        el: '#app',
        data: {
          message: 'hi vue'
        },
        methods: {
          // 反转字符的函数  模板中使用{{reverseFn()}}
          reverseFn () {
            console.log('reverseFn')
            return this.message.split('').reverse().join('')
          }
          // 每使用一次,会调用一次函数,重新执行内部逻辑,得到数据
        },
        computed: {
          // 反转字符计算属性 模板中使用{{reverseMsg}}
          reverseMsg () {
            console.log('reverseMsg')
            return this.message.split('').reverse().join('')
          }
          // 当多次调用的时候,之后执行一次逻辑,或走缓存
        }
      })
    </script>
  </body>
</html>

总结:

  • 函数也可以实现数据逻辑处理得到新数据,但是多没使用一次执行一次逻辑,性能不优。
  • 计算属性,在多次使用的时候,会走缓存,性能更好。
  • 将来对数据进行(较为复杂)逻辑处理,建议使用计算属性。

接口规则-Resetful

目标:了解一种接口定义规范resetful

接口规范:如何定义接口地址,请求方式,传参方式,对应不同的请求操作行为。

具体规则:

接口地址 请求方式 操作行为
/brands GET 查询所有列表
/brands/:id GET 查询单个详情 /brands/1
/brands POST 添加,提交的参数在请求体
/brands/:id DELETE 删除 /brands/1
/brands/:id PUT 修改 /brands/1 + 请求体{name,cTime} 全部修改
/brands/:id PATCH 修改 /brands/1 + 请求体{name} 个别修改

这个表格可以作为接口调用的参考。

09-插件-axios

axios是什么:

  • 是一个js插件,专注于网络通信(前端的xhr)。
  • 它可以在前端浏览器使用,也可以在后台nodejs环境中使用。
  • 如果在前端使用它是基于:xhr + promise 实现的

axios的下载:

axios的使用:

  • 查询所有

  • 查询单个

  • 添加操作

  • 删除操作

  • 修改操作

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

  <script src="./axios.min.js"></script>
  <script>
      // - 查询所有
      // axios.get('http://localhost:3000/brands').then(res=>{
      //   // res 响应报文对象(响应状态行+响应头+响应主体)
      //   // res.data 就是响应主体(返回的数据)
      //   console.log(res.data)
      // }).catch(err=>{
      //   // 错误对象
      //   console.log(err)
      // })


      // - 查询单个
      // axios.get('http://localhost:3000/brands/2').then(res=>{
      //   console.log(res.data)
      // }).catch(err=>{
      //   console.log(err)
      // })



      // - 添加操作
      // 第二个参数:请求体传参对象
      // axios.post('http://localhost:3000/brands',{
      //   name: '奥拓',
      //   cTime: new Date()
      // }).then(res=>{
      //   console.log('添加成功')
      // })



      // - 删除操作
      // axios.delete('http://localhost:3000/brands/4').then(res=>{
      //   console.log('删除成功')
      // })



      // - 修改操作
      // 第二个参数:请求体传参对象
      // axios.patch('http://localhost:3000/brands/3',{
      //   name: '奥拓'
      // }).then(res=>{
      //   console.log('修改成功')
      // })

      // axios.put('http://localhost:3000/brands/3',{
      //   name: '奥迪',
      //   cTime: new Date()
      // }).then(res=>{
      //   console.log('修改成功')
      // })

      // - 带查询参数
      // 1. 自己手动在地址栏拼接?后的键值对  ?id=2&name=宝马
      // 2. 可以传对象提交多个筛选条件 
      // 3. get()中第二个参数可以用来提交参数对象  {params:{更多筛选条件}}


      // json-server提供模糊查询  字段_like
      axios.get('http://localhost:3000/brands',{
        params:{
          name_like: '奥'
        }
      }).then(res=>{
        console.log(res.data)
      }).catch(err=>{
        console.log(err)
      })

  </script>
</body>

</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342