美文网首页前端开发那些事儿
《图解Vue3.0》- 第11节 组件数据管理

《图解Vue3.0》- 第11节 组件数据管理

作者: 张中华 | 来源:发表于2021-05-31 06:09 被阅读0次

一个组件的封装,基本上都会用到数据管理。就像你编写一个函数,有时候需要入参,函数内部拥有变量,然后有一个返回结果。对应到组件里面,有时也会带入参数(props),内部变量(data)和返回结果(ui)。伪代码如下:

function(props) {
    let data = {...};
    // 通过外部参数和内部数据返回一个UI视图
    return render(props, data)
}

接下来我们看看props和data的使用方式。

Props

props 作为外部参数传递给组件,一般可以传入多种类型,例如字符串,布尔类型,数组,对象等。为了更好的规范传入的props,有时也可以在组件内部规定好传入组件的props的数据类型。在组件内部使用时,就像函数一样,虽然js是解释性语言,修改props也不会报错,但是不要在组件内部修改props的值。

所以,vue中使用props的数据都是单向传递的,父-> 子,每当父组件的porps变化时,子组件也会重新渲染。

props核心概念

  • Prop 的大小写命名
  • 单向数据流
  • props数据类型
  • 静态或者动态的porps
  • props数据类型验证,必填,设置默认值等
Prop 的大小写命名

先看看简单的Prop的大小写命名,由于HTML 中的 attribute 名是大小写不敏感的,所以浏览器会把所有大写字符解释为小写字符。这意味着当你使用 DOM 中的模板时,camelCase (驼峰命名法) 的 prop 名需要使用其等价的 kebab-case (短横线分隔命名) 命名。
示例:
App.vue

<template>
  <Props1 firstName="中华" last-name="张"></Props1>
</template>

<script>
import Props1 from '@/components/Props/Props1'

export default {
  name: 'App',
  components: {
    Props1,
  }
}
</script>

Props1.vue

/**
* 测试props的命名
*/
<template>
    <div class="name-box">
        <div class="first-name">{{ firstName }}</div>
        <div class="last-name">{{ last-name }}</div>
    </div>
</template>
<script>
import { defineComponent } from '@vue/composition-api'

export default defineComponent({
    props: [ 'firstName', 'last-name'],
})
</script>
<style scoped>

</style>

这里先不做转换看看会出什么结果:


注意:如果我们不转换,这里就得不到值!

单向数据流

prop传递方向:parent -> child
所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。

另外,每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。

静态或者动态的porps

props可以传递动态的,也可以传递静态的, 如下示例,firstName就是使用动态方式传递的,你可以将data的firstName改变,界面也会重新渲染。

<template>
  <Props1 :firstName="firstName" last-name="张"></Props1>
</template>

<script>
import Props1 from '@/components/Props/Props1'

export default {
  name: 'App',
  components: {
    Props1,
  },
  data() {
      return {
          firstName: '中华'
      }
  }
}
</script>

props数据类型 && props数据类型验证,必填,设置默认值等

在上面的示例中,我们可以利用props将数据从父组件传递给子组件,props的数据类型除了上面的String类型,还可以传递的类型有:Number、Boolean、Array、Object、Function、Promise等。

我们在子组件中定义好了将要接收的props的名字,可是有时我们需要定义下props的类型该怎么做呢,或者有些需要必填、设置默认值又该怎么操作呢?

接下来看个小例子:
App.vue

<template>
  <Props1 firstName="中华" last-name="张" :interests="interests"></Props1>
</template>

<script>
import Props1 from '@/components/Props/Props1'

export default {
  name: 'App',
  components: {
    Props1,
  },
  data() {
    return {
      interests: "read"
    }
  }
}
</script>

Props1.vue

/**
* 测试props的命名
*/
<template>
    <div class="name-box">
        <div class="first-name">firstName: {{ firstName }}</div>
        <div class="last-name">lastName: {{ lastName }}</div>
        <div class="age">age: {{ age }}</div>
        <div class="interests">interests: {{ interests }}</div>

    </div>
</template>
<script>
import { defineComponent } from '@vue/composition-api'

export default defineComponent({
    props: {
        firstName: {
            type: String,
            required: true,
        },
        lastName: [String, Function], // 可以有多种类型
        age: {
            type: Number,
            default: 18,
        },
        interests: {
            type:String, 
            validator: function (value) {
                return value == 'read'; // 如果传的值不是read,在控制台会弹出警告,在程序上不会看出区别
            }

        }
    },
})
</script>
<style scoped>

</style>

data

组件的数据管理,出来外部传入的数据,还有内部的数据,就是data。
组件的 data 选项是一个函数。Vue 在创建新组件实例的过程中调用此函数。它应该返回一个对象,然后 Vue 会通过响应性系统将其包裹起来,并以 $data 的形式存储在组件实例中。
示例:

<template>
    <div class="container">
        初始值是: {{ initCount }}
        点击的次数: {{ count }}
        <button @click="clickBtn">按钮</button>
    </div>
</template>

<script>
export default {
    props: ['initCount'],
    data() {
        return {
            count: 0
        }
    },
    methods: {
        clickBtn() {
            this.count++;
        }
    }
}

</script>

<style scoped>
button {
    color: red;
    border: 1px solid #909090;
}
</style>

在上面的例子中,在data中定义了一个count,作为内部数据管理,显示在界面上。

相关文章

网友评论

    本文标题:《图解Vue3.0》- 第11节 组件数据管理

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