之前的文章我们介绍了 vue 中父组件之间的传值,本章我们再来看一下父子组件间传值的参数校验和非 Props 特性。

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<child :title="123"></child>
</div>
<script>
Vue.component("child", {
props: ['title'],
template: `
<p>{{title}}</p>
`
});
var app = new Vue({
el: '#app',
data: {
title: "hello world"
},
})
</script>
</body>
</html>

上面的代码中我们我们在父组件中定义了一个 title 数据,并通过 :title="" 的形式将 title 数据传给子组件 child,然后子组件通过 props 属性接收该 title,通过 template 模板将 title 输出,结果如下:

但是我们现在有这样一个需求,子组件想要校验父组件传过来的值,如果符合才显示,那么我们就可以通过 props 属性进行校验,在上面的代码中我们定义 props 为一个数组对象,其实我们可以将 props 定义为一个对象,如下:

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<child :title="title"></child>
</div>
<script>
Vue.component("child", {
props: {
title: Number
},
template: `
<p>{{title}}</p>
`
});
var app = new Vue({
el: '#app',
data: {
title: "hello world"
},
})
</script>
</body>
</html>

在上面的代码我们将 props 改为了对象形式,并且定义 title: Number,意思是将 title 定义为一个 Number 类型,我们现在在页面上看一下结果:

在控制台报错,意思说 tltle: "hello world" 是一个字符串,但我们在子组件定义为了一个 Number 类型,两者不符所以报错,所以我们可以将 props 下的 title 定义为 String 类型就可以了,当然我们也可以这样写 : title: [Number, String] ,意思是传入的 title 值既可以是 Number 类型也可以是 String 类型。

在 props 下的数据我们还可以定义其他属性,如下:

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<child :title="title"></child>
</div>
<script>
Vue.component("child", {
props: {
title: {
type: [Number, String],
required: true,
default: "hi vue",
validator(value){
return value.length > 5
}
},
},
template: `
<p>{{title}}</p>
`
});
var app = new Vue({
el: '#app',
data: {
title: "hello world"
},
})
</script>
</body>
</html>

上面的代码中我们将 props 中的 title 定义为了一个对象,对象中

  type 表示验证父组件传入数据的类型,

  required 表示该值是否必须传入,false 表示可以不传入,true 表示必须传入,即 <child> 标签内是否写 :title="" 传入该值。

  default 表示传入该值的默认值,如果上面的 required 为 false 并且父组件并没有传入 title 值,我们可以自己定义 title 的值。

  validator 表示验证的方法,我们可以自己定义传入值的校验方法,如传入值的长度等。

接下来我们说一下 props 特性和非 props 特性,在上面的代码中我们对父组件传过来的值都用 props 属性进行了接收,我们就可以把这个称为 props 特性,那它跟非 props 特性有什么区别的,非 props 特性就是我们不在 props 里接收父组件传过来的值,那么如果我们在子组件的 template 模板中使用该值,则会报错,同时非 props 特性会在 HTML 页面代码内暴露出传过来的值,即 title="",props 特性则不会,如下:

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<child :title="title"></child>
</div>
<script>
Vue.component("child", {
props: {
// title: {
// type: [Number, String],
// required: true,
// default: "hi vue",
// validator(value){
// return value.length > 5
// }
// },
},
template: `
<p>{{title}}</p>
`
});
var app = new Vue({
el: '#app',
data: {
title: "hello world"
},
})
</script>
</body>
</html>

我们在 props 中没有接收父组件传过来的 title 数据就在 template 模板中使用,则会在控制台报错,且在 HTML 代码中将 title: "hello word" 暴露在了标签内。props 特性接收 title 值的会就不会出现上面的情况。

以上代码演示我们是基于引入开发环境的 js 来演示的,即

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

如果我们使用生产环境则不会出现上面的控制台警告报错,这是为了线上使用阅读者舒适的阅读,生产版本如下:

<script src="https://cdn.jsdelivr.net/npm/vue"></script>

Vue 进阶之路(九)的更多相关文章

  1. Vue 进阶之路(八)

    之前的文章我们对组件 component 进行了简单的介绍,本章我们将深入了解一下组件,并实现父子组件间的传值. <!DOCTYPE html> <html lang="e ...

  2. Vue 进阶之路(七)

    之前的文章我们对 vue 的列表输出做了介绍,本章我们来看一下 vue 的组件 component. <!DOCTYPE html> <html lang="en" ...

  3. Vue 进阶之路(六)

    上篇文章我们分析了一下 vue 中的条件渲染,本篇我们说一下 vue 中的列表渲染和 set 方法. <!DOCTYPE html> <html lang="en" ...

  4. Vue 进阶之路(五)

    之前的文章我们说了一下 vue 的样式绑定,这篇文章来介绍一下 vue 中的条件渲染,先看下面的代码: <!DOCTYPE html> <html lang="en&quo ...

  5. Vue 进阶之路(四)

    之前的文章我们已经对 vue 有了初步认识,这篇文章我们通过一个例子说一下 vue 的样式绑定. 现在我们想要是想这样一个需求,页面上有个单词,当我们点击它的时候颜色变为红色,再点击一次变为原来的颜色 ...

  6. Vue 进阶之路(三)

    之前的文章我们已经对 vue 有了初步认识,这篇文章我们通过一个例子说一下 vue 的方法 methods,计算属性 computed 和监听器 watch. 现在我们有一个需求,变量 firstNa ...

  7. Vue 进阶之路(二)

    之前的文章我们初识了 vue,对其原理,数据绑定和方法进行了简单的演示,本篇将对 vue 插值表达式,v-text,v-html 进行讲解. <!DOCTYPE html> <htm ...

  8. Vue 进阶之路(一)

    vue 3.x 马上就要问世了,显然尤大大是不想让我们好好活了,但是转念一想,比你优秀的人都还在努力,那我们努力还有什么用,开个玩笑而已,本人对于 vue 的接触时间不长,对其也没有深入地去研究源码, ...

  9. Vue 进阶之路(十)

    之前的文章介绍了 vue 的组件化,本章我们来看一下 vue 中组件的原生事件. <!DOCTYPE html> <html lang="en"> < ...

随机推荐

  1. python---haproxy---文件操作

    haproxy 文件操作,操作属于简单操作,不复杂 # -*- coding:utf-8 -*- # LC def search(*args): #查找Haproxy文件中的服务器 list1 = [ ...

  2. Django用普通user对象登录的必须准备步骤

    zt from http://segmentfault.com/q/1010000000343563 在stackoverflow找到了解答(http://stackoverflow.com/ques ...

  3. Django push: Using Server-Sent Events and WebSocket with Django

    http://curella.org/blog/2012/jul/17/django-push-using-server-sent-events-and-websocket/ The goal of ...

  4. C语言中函数中传入一个数组,并且返回一个数组

    一.C语言可以很容易将一个数组传递给一个自定义函数,格式如下: main() { adb(float a[],int n); } float adb(float a[],int n) { …… ret ...

  5. Hive入门学习--HIve简介

    现在想要应聘大数据分析或者数据挖掘岗位,很多都需要会使用Hive,Mapreduce,Hadoop等这些大数据分析技术.为了充实自己就先从简单的Hive开始吧.接下来的几篇文章是记录我如何入门学习Hi ...

  6. 基于Cloudera Search设计数据灾备方案

    当实际项目上线到生产环境中,难以避免一些意外情况,如数据丢失.服务器停机等.对于系统的搜索服务来说,当遇到停机的情况意味着在停机这段时间内,用户都不能通过搜索的相关功能进行访问数据,停机意味着将这一段 ...

  7. 第一章 C++概述

    第一节 C++语言的发展历史 略 第二节 C++语言的特点 1.C++是一种面向对象的程序设计语言,其中的新技术主要包括: 抽象数据类型 封装和信息隐蔽 以继承和派生方式实现程序的重用 以运算符重载和 ...

  8. c语言中realloc()函数解析

    一.基本特性 1. realloc()函数可以重用或扩展以前用malloc().calloc()及realloc()函数自身分配的内存. 2. realloc()函数需两个参数:一个是包含地址的指针( ...

  9. 小苹果WP(实验吧-隐写术)

    本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=706 前言:本文是实验吧训练题库里隐写术部分的一道题:"小苹果"的Write Up. 题目链接: ...

  10. 1.Spring Framework 5.0 入门篇

    1.为什么学习Spring? 随着对Java EE的不断接触和理解,你会发现Spring  在各个企业和项目中发挥着越来越重要的作用.掌握Spring 已成为我们IT行业生存必学的本领之一. Spri ...