美文网首页
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

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

  • vue过滤器的简单使用介绍

    一、vue过滤器的介绍 官方言: Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化。过滤器可以用在两...

  • vue 2.0 日期过滤器

    过滤器 Vue.js允许你自定义过滤器,可被用作一些常见的文本格式化。 过滤器使用: mustache插值 v-b...

  • vue 知识点整理——过滤器(filter)、计算属性(comp

    过滤器 概念:Vue.js 允许你自定义过滤器,可被用作一些常见的文本格式化。过滤器可以用在两个地方:mustac...

  • day02-vuejs的过滤器与生命周期

    过滤器: 概念:Vue.js 允许你自定义过滤器,可被用作一些常见的文本格式化。过滤器可以用在两个地方:musta...

  • Vue-全局过滤器的基本使用

    过滤器的概念 Vue.js允许你自定义过滤器,可被用作一些常见的文本格式化,过滤器可以用在两个地方:mustach...

  • Vue.js过滤器filter的使用

    概念: Vue.js允许自定义过滤器,可被用作一些常见的文本格式化。 过滤器可以用在两个地方:mustache插值...

  • vue之filter(过滤器)

    Vue.js中可以自定义过滤器,用于常见的文本格式化(比如:格式化时间、首字母大写,动态绑定el-tag的样式)过...

  • 过滤器

    Vue.js 允许你自定义过滤器,可被用作一些常见的文本格式化。过滤器可以用在两个地方:mustache 插值和 ...

  • 2019-03-20

    6 过滤器 Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化。过滤器可以用在两个地方:双花括号插值和...

网友评论

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

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