美文网首页
Vue.js备忘记录(四) vue过滤器文本格式化, 插槽 sl

Vue.js备忘记录(四) vue过滤器文本格式化, 插槽 sl

作者: 熊爸天下_56c7 | 来源:发表于2020-11-03 08:51 被阅读0次

    一. vue过滤器 //文本格式化

    Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化。

    过滤器可以用在两个地方:双花括号插值和v-bind表达式

    过滤器应该被添加在 JavaScript 表达式的尾部,由“管道”符号指示:

    <!-- 在双花括号中 -->
    {{ message | capitalize }}
    
    <!-- 在 `v-bind` 中 -->
    <div v-bind:id="rawId | formatId"></div>
    
    <!-- 过滤器可以串联 -->
    {{ message | filterA | filterB }}
    

    你可以在一个组件的选项中定义本地的过滤器:

    filters: {
      capitalize: function (value) {
        if (!value) return ''
        value = value.toString()
        return value.charAt(0).toUpperCase() + value.slice(1)
      }
    }
    

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

    Vue.filter('capitalize', function (value) {
      if (!value) return ''
      value = value.toString()
      return value.charAt(0).toUpperCase() + value.slice(1)
    })
    
    new Vue({
      // ...
    })
    

    注意:过滤器的第一个参数已经被规定死了,永远都是 过滤器 管道符号前面的那个数据

    二. 数组中的那些方法是响应式的?

    我们知道,我们可以用v-for遍历数组, 那么数组中那些方法是改变自身的?只有改变自身的方法才不用重新赋值吧

    1.以下方法是响应式的

    let arr =['a','b','c','d']
    //1 push数组最后面添加元素
    arr.push('e')
    
    //2.pop删除最后一个元素
    arr.pop()
    
    //3.shift删除第一个元素
    arr.shift()
    
    //4.unshift 数组最前面添加元素
    arr.unshift('e') 
    
    //5.splice 删除/插入/替换元素
    arr.splice(2,1) //从2开始删除1个
    arr.splice(2,0,'f') //从2之后插入元素
    arr.splice(2,1,'f') //替换2之后的元素(从2删除1个元素,再添加一个元素)
    
    //6.sort排序
    arr.sort()
    
    //7. reverse()反序
    arr.reverse()
    

    2.以下方法不是响应式的

    通过索引值改变数组内容不是响应式的

    this.arr[2]='f'
    

    如何解决?

    this.arr.splice(2,1,'f')
    //或者
    Vue.set(this.arr,2,'f')     //vue方式
    

    三. 插槽 slot

    插槽的目的是提高组件的拓展性, 就像电脑的USB插槽.

    解决子组件模板太过固化不灵活的问题,这时候我们给模板预备插槽

    比如:

    下面的例子,不同的导航栏存在区别,同时又有共性,

    我们可以定义一个组件,这个组件里有三个插槽,每个插槽里都可以传入不同的东西,这使得这个导航栏组件可以应用的更广

    这里我们的思想是: 抽取共性,保留插槽

    1.插槽的基本使用

    定义插槽<slot>默认值</slot>

        let template=`
        <div>
          <p>下面让你自由发挥,你给我啥我显示啥</p>
          <slot></slot>    <--这就是个插槽,里面的内容由调用者决定  -->
        </div>
    

    这样子组件就有插槽了,父组件调用时可以往里面插入东西了

    <子组件> 把要插入的内容写在这,可以是任何标签 </子组件> 
    

    2.具名插槽

    <slot  name="left"></slot>  
    <--这个插槽名叫left  -->  <slot  name="center"></slot>
    

    调用时: 要在插入的标签中使用 slot="插槽名" 来插入

    <子组件> <插入的标签 slot="left"></插入的标签> </子组件>
    

    例:神还原上面 的京东截图 😂

    
    <!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>
      <div id='app'>
        <cpn>
          <span slot="left">三</span>
          <span slot="center">JD<input type="text" placeholder="🔍这是一个搜索框"></span>
          <button slot="right">登录</button>
        </cpn>
        <cpn><input slot="center" type="text" placeholder="🔎这是一个搜索框"></cpn>
        <cpn><strong slot="center">"购物车"</strong></cpn>
        <cpn>
          <table slot="center" style="display: inline-block;">
            <tr>
              <td> 📍商品 </td>
              <td> 评价 </td>
              <td> 详情 </td>
              <td> 推荐 </td>
            </tr>
          </table>
        </cpn>
        <cpn></cpn>
      </div>
      <script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
      <script>
    
        let template = `
        <div>
          <slot name="left"><</slot>
          <slot name="center"><span>默认显示一个span</span></slot>
          <slot name="right">...</slot>
        </div>
        `
        const cpn = {
          template,
        }
        const vm = new Vue({
          el: '#app',
          components: {
            cpn
          }
        })
      </script>
    </body>
    
    </html>
    

    3. 作用域插槽

    父组件通过作用域插槽拿到子组件数据,但是按照父组件自己的方式展示

    要做到这一点,我们要在子组件模板中声明slot时 v-bind动态绑定数据源

    在父组件调用时,标签中加入slot-scope='slot' 来获取slot标签

    然后用slot.data获取数据,用来展示

    <!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>
      <div id='app'>
        <cpn></cpn>
        <cpn>
          <div slot-scope='slot'>
            <span v-for="item in slot.data" >{{item}} - </span>       父组件的展示
          </div>
        </cpn>
      </div>
      <script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
      <script>
    
        let template = `
        <div>   
        <slot :data='languages'>    //子组件用列表来展示
          <ul>
            <li v-for="language in languages" :key="language">{{language}}</li>
          </ul>
        </slot> 
        </div> 
        `
        const cpn = {
          template,
          data() {
            return {
              languages: ['c', "python", 'javascript', 'c#', 'DART', 'JAVA']
            }
          },
        }
        const vm = new Vue({
          el: '#app',
          components: {
            cpn
          }
        })
      </script>
    </body>
    
    </html>
    

    4. 不要在插槽上直接设置class

    <slot name="item-text" :class="{acticv:isActive}"></slot>
    这种写法不会起作用,
    因为插槽是直接被替换成别的标签了,
    那个标签替换它的时候不会关注到它里面的class
    
    正确的写法是:
    <div :class="{acticv:isActive}">
      <slot name="item-text"></slot>
    </div>
    

    相关文章

      网友评论

          本文标题:Vue.js备忘记录(四) vue过滤器文本格式化, 插槽 sl

          本文链接:https://www.haomeiwen.com/subject/bcfpmktx.html