props配置

111 阅读2分钟

功能:让组件接收外部传过来的数据

(1).传递数据:

image.png

(2).接收数据:

第一种方式(只接收):props:['name']

如图如果我想让下图的第二个改为小花,女,16,,有什么简便的法子吗 image.png

通过props配置就能实现
image.png

image.png

如果想让年龄加一岁,在age+1
image.png

会发现age是一个字符串,它并不会进行运算,而是直接在后面加一个1 image.png

而如果用v-bind得到的就是表达式,然后我们可以用简写形式 image.png

得到的age就是数字类型
image.png

第二种方式(限制类型):props:{name:Number}

我们在接收年龄要求是数字类型,而不是字符串类型,那么我们可以在接收是可以进行一些限制,类如我们规定接收到的name和sex是字符串,age是数字 image.png

所以如果我们不在age动态绑定v-bind
image.png

就会报错 image.png

第三种方式(限制类型、限制必要性、指定默认值):
props:{
name:{
type:String,//类型
required:true,//必要性
default:'老王'//默认值
}
}

props除了上方这个较为详细的写法,还有更为详细的写法
image.png

如果没写age,
image.png

就会默认age=99,再去加一 image.png

如果不写name
image.png

name不仅不会显示出来,vue还会发出警告 image.png

一般我们不会写那么完整的props,而是写简单的props

在props也不能随便乱写,如果你写一个phone image.png

在vc(组件实例对象)中phone是显示没找到的 image.png

外部引入的数据是不能改的,就是说props中的数据不能改

如下图我设置一个按钮,修改年龄 image.png

它会报错提示不能更改prop image.png

备注:props是只读的,Vue底层会检测你对props的修改,如果进行了修改,就会发出警告, 若业务发需求确实修改,那么请复制props的内容到data中一份,然后去修改data中的 数据。

prop和data,prop的优先级更高

如果一定要更改年龄,那你可以在data里加一个Myage,把props的age的值赋予到Myage中,通过修改Myage来改年龄
image.png

点击按钮 image.png

年龄就被修改了
image.png

props也不是什么都传的,例如key(还有ref等等) image.png image.png

会出现报错,说key被征用了 image.png

本小结用到的代码:
MyStudent.vue文件

<template>
  <div class="demo">
    <h1>{{ msg }}</h1>
    <h1>学生姓名:{{ name }}</h1>
    <h1>学生性别:{{ sex }}</h1>
    <h1>学生年龄:{{ Myage + 1 }}</h1>
    <button @click="updateAge">点我修改年龄</button>
  </div>
</template>

<script>
// 组件交互相关的代码(数据、方法等等)
export default {
  name: "MyStudent",
  data() {
    return {
      msg: "我是一个普通学生 ",
      Myage: this.age,
    };
  },
  methods: {
    updateAge() {
      // console.log(this.age)
      this.Myage++;
    },
  },
  //简单接收
  props: ["name", "sex", "age"],

  // 接收的同时对数据进行类型的限制
  /*props: {
    name: String,
    sex: String,
    age: Number,
  },*/

  //接收的同时对数据:进行类型的限制+默认值的指定+必要性的限制
  // props: {
  //   name: {
  //     type: String,
  //     required: true,
  //   },
  //   sex: {
  //     type: String,
  //     require: true,
  //   },
  //   age: {
  //     type: Number,
  //     default: 99,
  //   },
  // },
};
</script>

App.vue文件

<template>
  <div>
    1
    <Student name='张三' sex='男' :age=18 />
    <hr />
    2
    <Student name='小花' sex='女' :age=16 />
    <hr />
  </div>
</template>

<script>
// 引入组件
import Student from "./components/MyStudent";
export default {
  name: "App",
  components: { Student },
  data() {
    return {};
  },
};
</script>