vue笔记2

vue笔记2

事件监听listeners属性与$attrs属性

attrs属性
$attrs属性包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外)。
当一个组件没有声明任何prop 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过
v-bind="this.$attrs" 传入内部组件——在创建高级别的组件时非常有用,通常多层组件嵌套时,使用他可以简化代码。
简单点讲就是包含了所以父组件在子组件上设置的属性(除了prop传递的属性、class 和 style )。

 <div id="app">
      <base-input
        label="姓名"
        class="name-input"
        placeholder="请输入姓名"
        test-attrs="$attrs"
      ></base-input>
    </div>
      Vue.component("base-input", {
        inheritAttrs: true, //此处设置禁用继承特性
        props: ["label"],
        template: `
        <label>
          {{label}}-
          {{$attrs.placeholder}}-
          <input v-bind="$attrs"/>
        </label>
        `,
        mounted: function() {
          console.log(this.$attrs);//会输出test-attrs和placeholder
        }
      });
      const app = new Vue({
        el: "#app"
      });

listeners属性
想要在一个组件的根元素上直接监听一个原生事件。这时,你可以使用v-on.native 修饰符,
但是某些组件可能会对原生的dom元素进行重构,那么.native 修饰符将无法监听到事件。
vue提供$listeners属性,它包含了作用于组件上的所有监听器。使用他可以获取到所有监听器

假如有三个层级的组件嵌套A-》B-》C,子组件触发父组件通常我们使用v-on在父组件绑定事件,并在子组件中使用this.$emit()
触发,例如在B中触发A的test事件就是如此,那么在C中如果想触发A的test事件呢?此时,在B中调用组件时使用

<C  v-on="$listeners"></C>

在组件C中就可以触发A的test事件了

.sync 修饰符

在使用v-bindprops来进行组件数据流传递时,它是单向的数据流传递,
也就是由父组件将数据传递到子组件,vue的这种设计是为了避免数据流传递混乱,
但是在某些场景,我们还是需要在子组件中改变数据,使用.sync修饰符可以更新prop
父组件调用时:

<text-document v-bind:title.sync="doc.title"></text-document>

子组件触发改变:

this.$emit('update:title', newTitle)

插槽

插槽内容

插槽,你可以理解为使用插槽,它将允许你在组件标签中内嵌一些内容,包括文字,html代码、组件等,
并且能够在组件模板中渲染出来。插槽实现的内容分发,在开发组件插件时有用。
例如你在调用组件时内嵌一些内容

<navigation-link url="/profile">
  <span class="fa fa-user"></span>
  Your Profile
</navigation-link>

然后在组件的模板中使用<slot></slot>去接受这些内容,在模板渲染时的地方会被你内嵌的内容代替,从而渲染出来

<a v-bind:href="url" class="nav-link">
  <slot></slot>
</a>

渲染结果:

<a v-bind:href="url" class="nav-link">
   <span class="fa fa-user"></span>
  Your Profile
</a>

插槽的后备内容

插槽的后备内容实际上就是插槽内容的默认值,在设置了插槽却没有传入内容时,插槽会默认渲染的内容。

<button type="submit">
  <slot>Submit</slot>
</button>

在调用组件时没有传入插槽内容的话,默认渲染Submit。

具名插槽

当我们需要在一个组件里面使用多个不同的插槽时,可以使用具名插槽,具名插槽的设计,使得插槽内容的输入更加灵活,解耦性更高。
使用:
1.组件模板中,给 <slot></slot>进行命名 <slot name="slotName"></slot>

<div class="container">
  <header>
    <slot name="header"></slot>
  </header>
  <main>
    <slot></slot>
  </main>
  <footer>
    <slot name="footer"></slot>
  </footer>
</div>

2.在组件调用,插槽内容传入时,使用v-slot = 'slotName',值得注意的是v-slot可以缩写为#

<base-layout>
  <template v-slot:header>
    <h1>Here might be a page title</h1>
  </template>

  <p>A paragraph for the main content.</p>
  <p>And another one.</p>

  <template v-slot:footer>
    <p>Here's some contact info</p>
  </template>
</base-layout>

作用域插槽

在插槽使用时,有时候需要在父级中动态的改变插槽后备内容,而插槽的后备内容渲染的是子级的内容,那么在父级中就无法访问

<span>
  <slot>{{ user.lastName }}</slot>
</span>

我们可能想换掉备用内容,用名而非姓来显示。如下:

<current-user>
  {{ user.firstName }}
</current-user>

上述代码块是不会成功的。那么我们需要使用作用域插槽来实现,
为了让 user 在父级的插槽内容中可用,我们可以将 user 作为 <slot> 元素的一个 attribute 绑定上去:


<span>
  <slot v-bind:user="user">
    {{ user.lastName }}
  </slot>
</span>

绑定在 元素上的 attribute 被称为插槽 prop。现在在父级作用域中,
我们可以使用带值的 v-slot 来定义我们提供的插槽 prop 的名字:

<current-user>
  <template v-slot:default="slotProps">
    {{ slotProps.user.firstName }}
  </template>
</current-user>

这里你可以理解为通过插槽 propv-bind:user="user",将子级的user暴露给父级,
父级再通过v-slot:default="slotProps"来接收,并且使用了一个别名slotProps来访问user,
从而实现在父级访问子级内容,来动态修改插槽后备内容。

vue自定义指令

new Vue({
	el:
	data:
	directives:{//自定义指令
		change:{//change是自定义指令名称v-change
			//指令的狗子函数
			bind:function(){},//指令绑定到元素时
			inserted:function(){},//被绑定元素插入父节点时调用。
			update:function(){},//如果调用指令时,传递参数、参数变化此函数执行
			componentUpdated:function(){},//指令所在组件的VNode及其子VNode全部更新后调用。
			unbind:function(){},//解除绑定的元素
		}
	}
})

钩子函数参数

  • el:指令所绑定的元素,可以用来直接操作 DOM 。
  • binding:一个对象,包含以下属性:
    • name:指令名,不包括 v- 前缀。
    • value:指令的绑定值,例如:v-my-directive=“1 + 1” 中,绑定值为 2。
    • oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
    • expression:字符串形式的指令表达式。例如 v-my-directive=“1 + 1” 中,表达式为 “1 + 1”。
    • arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 “foo”。常用语动态指令出参数传递。
    • modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }。
  • vnode:Vue 编译生成的虚拟节点。
  • oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

过滤器

Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化。过滤器可以用在两个地方:双花括号插值
v-bind表达式 (后者从 2.1.0+ 开始支持)。过滤器应该被添加在 JavaScript 表达式的尾部,由“管道”符号指示:

<!-- 在双花括号中 -->
{{ message | capitalize }}

<!-- 在 `v-bind` 中 -->
<div v-bind:id="rawId | formatId"></div>

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

filters: {
  capitalize: function (value) {
    if (!value) return ''
    value = value.toString()
    return value.charAt(0).toUpperCase() + value.slice(1)
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 尚硅谷的Vue2笔记是学习Vue技术的好帮手。这份笔记详细地介绍了Vue的基本概念和使用方法,包括Vue的属性、指令、事件、计算属性、过滤器、组件等等。通过阅读这份笔记,我们可以了解Vue的整个生命周期,并且学习如何在Vue中绑定数据、响应事件、使用组件化等等。另外,笔记中也提到了Vue的MVVM模式、路由、状态管理、Ajax等进阶使用方法,以及Vue的一些注意点和优化技巧,这些非常实用且有助于深入学习和应用Vue技术。 总体来说,尚硅谷的Vue2笔记内容丰富、清晰易懂,适合初学者和中级开发者使用,是学习Vue技术的一份不错资料。需要注意的是,笔记中的代码及部分内容可能存在过时和不准确的情况,需要和Vue官方文档及其他权威资料进行比较和验证。 ### 回答2: 尚硅谷的Vue2笔记是一份非常全面和深入的Vue学习资料,它涵盖了Vue框架的基本概念和重要特性,包括Vue的组件化开发、指令、路由、Vuex状态管理、axios网络请求等。该笔记不仅注重理论知识的讲解,而且注重实战应用。它提供了大量的示例代码和练习项目,帮助学习者理解和掌握Vue的核心概念和技术。 在Vue2笔记中,作者从Vue的基本概念和MVVM架构模式开始讲解,然后逐步深入介绍了Vue的各种特性和用法,如组件、生命周期、计算属性、watch、事件处理、槽位、指令等等。特别是在组件化开发方面,作者详细介绍了组件之间的通信方式、props和$emit的使用、slot插槽的应用等等,这些都是Vue组件化开发中非常重要的概念。 除了组件化开发之外,Vue2笔记还详细介绍了Vue的路由、状态管理和网络请求等其他关键特性。在路由方面,作者讲解了Vue-Router的基本使用和路由守卫的应用,让学习者能够掌握Vue应用的页面导航和权限控制。在状态管理方面,作者讲解了Vuex的设计思想和使用方法,使学习者能够在复杂的应用中更好地管理和共享状态。在网络请求方面,作者介绍了axios库的使用和封装方法,帮助学习者更好地理解Vue应用中的数据请求和展示。 总的来说,尚硅谷Vue2笔记对于学习Vue框架的人来说是一份非常优秀的教材。它详细介绍了Vue的各个方面,并提供了丰富的练习项目,帮助学习者更好地掌握Vue的核心技术和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值