zoukankan      html  css  js  c++  java
  • ref属性与props配置项

    ref

      文档地址:https://cn.vuejs.org/v2/api/#ref

      预期类型:String

      ref 被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的 $refs 对象上。如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件。
      关于 ref 注册时间的重要说明:因为 ref 本身是作为渲染结果被创建的,在初始渲染的时候你不能访问它们 - 它们还不存在!$refs 也不是响应式的,因此你不应该试图用它在模板中做数据绑定。

    总结

      1. 被用来给元素或子组件注册引用信息(id的替代者)
      2. 应用在html标签上获取的是真实DOM元素,应用在组件标签上是组件实例对象(vc)
      3. 使用方式:
          1. 打标识:```<h1 ref="xxx">.....</h1>``` 或 ```<School ref="xxx"></School>```
          2. 获取:```this.$refs.xxx```

    代码举例

    使用的School组件代码和上一篇的一样,就不再例举

    ref是vue中与原生html中id的替代者,相信大家对document.getElementById(id)一定比较熟悉,在vue中我们使用ref属性实现

    <template>
        <div>
            <h1 v-text="msg" ref="title"></h1>
            <button ref="btn" @click="showDOM">点我输出上方的DOM元素</button>
            <School ref="sch"/>
        </div>
    </template>
    
    <script>
        //引入School组件
        import School from './components/School'
    
        export default {
            name:'App',
            components:{School},
            data() {
                return {
                    msg:'欢迎学习Vue!'
                }
            },
            methods: {
                showDOM(){
                    console.log(this.$refs.title) //真实DOM元素
                    console.log(this.$refs.btn) //真实DOM元素
                    console.log(this.$refs.sch) //School组件的实例对象(vc)
                }
            },
        }
    </script>

    效果展示:

    prop配置

    单向数据流

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

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

    这里有两种常见的试图变更一个 prop 的情形:

    1.这个 prop 用来传递一个初始值;这个子组件接下来希望将其作为一个本地的 prop 数据来使用。在这种情况下,最好定义一个本地的 data property 并将这个 prop 用作其初始值:

    props: ['initialCounter'],
    data: function () {
      return {
        counter: this.initialCounter
      }
    }

    2.这个 prop 以一种原始的值传入且需要进行转换。在这种情况下,最好使用这个 prop 的值来定义一个计算属性:

    props: ['size'],
    computed: {
      normalizedSize: function () {
        return this.size.trim().toLowerCase()
      }
    }

    注意在 JavaScript 中对象和数组是通过引用传入的,所以对于一个数组或对象类型的 prop 来说,在子组件中改变变更这个对象或数组本身将会影响到父组件的状态。

    prop验证

    我们可以为组件的 prop 指定验证要求,例如你知道的这些类型。如果有一个需求没有被满足,则 Vue 会在浏览器控制台中警告你。这在开发一个会被别人用到的组件时尤其有帮助。

    为了定制 prop 的验证方式,你可以为 props 中的值提供一个带有验证需求的对象,而不是一个字符串数组。例如:

    Vue.component('my-component', {
      props: {
        // 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)
        propA: Number,
        // 多个可能的类型
        propB: [String, Number],
        // 必填的字符串
        propC: {
          type: String,
          required: true
        },
        // 带有默认值的数字
        propD: {
          type: Number,
          default: 100
        },
        // 带有默认值的对象
        propE: {
          type: Object,
          // 对象或数组默认值必须从一个工厂函数获取
          default: function () {
            return { message: 'hello' }
          }
        },
        // 自定义验证函数
        propF: {
          validator: function (value) {
            // 这个值必须匹配下列字符串中的一个
            return ['success', 'warning', 'danger'].indexOf(value) !== -1
          }
        }
      }
    })

    当 prop 验证失败的时候,(开发环境构建版本的) Vue 将会产生一个控制台的警告。

    注意那些 prop 会在一个组件实例创建之前进行验证,所以实例的 property (如 data、computed 等) 在 default 或 validator 函数中是不可用的。

    类型检查

    type 可以是下列原生构造函数中的一个:

      1.String
      2.Number
      3.Boolean
      4.Array
      5.Object
      6.Date
      7.Function
      8.Symbol

    总结

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

    2. 传递数据:```<Demo name="xxx"/>```

    3. 接收数据:

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

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

        3. 第三种方式(限制类型、限制必要性、指定默认值):

            ```js
            props:{
             name:{
             type:String, //类型
             required:true, //必要性
             default:'wangxq' //默认值
             }
            }
            ```
     
        > 备注:props是只读的,Vue底层会监测你对props的修改,如果进行了修改,就会发出警告,若业务需求确实需要修改,那么请复制props的内容到data中一份,然后去修改data中的数据。

    代码示例

    <template>
        <div>
            <h1>{{msg}}</h1>
            <h2>学生姓名:{{name}}</h2>
            <h2>学生性别:{{sex}}</h2>
            <h2>学生年龄:{{myAge+1}}</h2>
            <button @click="updateAge">年龄加1</button>
        </div>
    </template>
    
    <script>
        export default {
            name:'Student',
            data() {
                console.log(this)
                return {
                    msg:'我是一个西华大学的学生',
                    myAge:this.age
                }
            },
            methods: {
                updateAge(){
                    this.myAge++
                }
            },
            //简单声明接收
            // props:['name','age','sex'] 
    
            //接收的同时对数据进行类型限制
            /* props:{
                name:String,
                age:Number,
                sex:String
            } */
    
            //接收的同时对数据:进行类型限制+默认值的指定+必要性的限制
            props:{
                name:{
                    type:String, //name的类型是字符串
                    required:true, //name是必要的
                },
                age:{
                    type:Number,
                    default:18//默认值
                },
                sex:{
                    type:String,
                    required:true
                }
            }
        }
    </script>

    运行结果

  • 相关阅读:
    WebStorm2019
    微信公众号互阅平台-真实提高阅读量-「作者加鸡腿」
    macos 致命错误: 在类路径或引导类路径中找不到程序包 java.lang
    IDEA2020激活码 / IDEA 2020.1.2激活破解教程
    Linux命令大全
    2019年终总结-2020展望「定版」
    SpringBoot如何切换Redis默认库
    uniapp增加百度统计代码(h5)
    修改MyEclipse/Eclipse左侧文字大小(MacOS/Windows)
    Invalid connection string format, a valid format is: "host:port:sid"
  • 原文地址:https://www.cnblogs.com/ftx3q/p/15331354.html
Copyright © 2011-2022 走看看