vue-cli 的使用

        安装vue-cli :npm install -g @vue/cli

        在终端下运行如下的命令,创建指定名称的项目: vue cerate 项目的名称

        vue 项目中 src 项目的构成

                assets 文件夹:存放项目中用到的静态资源文件,例如:css 样式表、图片资源
                components 文件夹:程序员封装的、可复用的组件,都要放到 components 目录下
                main.js 是项目的入口文件。整个项目的运行,要先执行 main.js
                App.vue 是项目的根组件。

Vue 组件的三个组成部分

                template :组件的模板结构

                script :组件的 javascritp 行为

                style :组件的样式

<template>
  
</template>

<script>
export default {
    data () {
        
        return {
            username : 'xx'

        }

    },

}
</script>

<style>

</style>

        【注】.vue 组件中的 data 数据源 必须是一个函数,由 return 返回数据,不能直接指向一个数据对象。

        style标签中的两个属性

                lang = '值',  指定编写css的语法  (值:css(默认),less)

                scoped ,自动为每个组件分配唯一的自定义属性,使得该组件样式只对该组件生效

                        【注】当前组件样式对其子组件不生效

                                解决方法: 使用 /deep/深度选择器 

                                                /deep/    选择器    {  样式  }

        

Vue 组件的使用

        注册私有组件

                在app.vue组件中做出以下步骤

        步骤一:在 script 标签中导入子组件  (Left是子组件名, @/components/Left.vue是子组件路径)

                import  Left  form  '@/components/Left.vue'

        步骤二:在 script 标签的  export default { }  中注册组件

                components : {

                        Left,

                }

        步骤三:在 template 标签中使用子组件

                <Left>   </Left>

        注册全局组件

                在 main.js中做出以下步骤

                 import  Left  form  '@/components/Left.vue'

                 Vue.component('MyLeft',Left)

        组件之间的数据共享

                组件之间的数据共享分为三种情况:

                        父向子传递数据,

                        子向父传递数据,

                         兄弟之间传递数据

                父向子传递数据

                                通过自定义属性实现

                                父组件

<template>
    
       <div>

            // :name='usename'代表传入变量 usename的值,:age='18'代表传入数字18,
            //    mes='你好'代表传入字符串你好
            <Left :name='usename' :age='18' mes='你好'>   </Left>

        </div

</template>



<script>

    import Left from '@/components/Left.vue'

    export default {

        components: {
        
            Left,    
        
        },
        
        data() {

            return {
                usename: '张三'
            
            }
        }
    }

</script>

                                子组件

                                【注】props中的属性是只读的,不能在子组件中重新给这些属性赋值,要想修改 props 的值,可以把 props 的值转存到 data 中。props中的属性在子组件中的用法与数据源用法相同

<script>

    export default {

        //语法格式,但该格式不能定义属性类型
       // props : ['name','age','mes']

        // 语法格式二
        props: {
            
            name:{
                //default 定义属性的默认值
                default: '',
                
                //type定义属性的类型
                type: String,

                //required 定义属性是否为必填选项
                required : true,

            },

            age:{
                //default 定义属性的默认值
                default: 0,
                
                //type定义属性的类型
                type: Number,

                //required 定义属性是否为必填选项
                required : true,

            },

            mes:{
                //default 定义属性的默认值
                default: '',
                
                //type定义属性的类型
                type: String,

                //required 定义属性是否为必填选项,默认为false
                required : false,

            },
        
        },

        data() {
            return {
                username: this.name,
                userage: this.age
            }

        }
    }

</script>

                        子向父传递数据

                                        通过自定义事件来实现

                                        父组件

<template>
    
       <div>

            //获取子组件传递过来的值 @子组件的自定义事件名='事件函数名'
            <Left @getName='name'>   </Left>

        </div

</template>



<script>

    import Left from '@/components/Left.vue'

    export default {

        components: {
        
            Left,    
        
        },
        
       methods: {
            name(val) {
                //val 就是从子组件传递过来的值
                console.log(val)

            }

        }
    }

</script>

                                       子组件

<script>

    export default {
        
        data() {

            return {
                usename: '张三'
            
            }
        },

        methods: {
            
            方法名 () {
                // 格式:this.$emit('自定义事件名',要传的数据)
                this.$emit('getName',this.name)

            }

        }
    }

</script>

                     

                         兄弟之间传递数据           

                                        通过中间文件 EventBus.js 实现

                                        【注】该方法也适用于深层嵌套的父子组件

                                        在components文件中创建 EventBus.js文件

import Vue from 'vue'


export default new Vue()

                                        发送方

<script>

    import Bus from '@/components/EventBus.js'

    export default {
        
        data() {

            return {
                usename: '张三'
            
            }
        },

        methods: {
            sendData() {
                //bus.$emit('事件名称', 要发送的数据) 
                bus.$emit('share',this.usename)

            }

        }
    }

</script>

                               接受方

<script>

    import Bus from '@/components/EventBus.js'

    export default {
        
      //created()是生命周期中的一个函数
      created() {

            //bus.$on('事件名称', 事件处理函数)
            bus.$on('share',val => {

                //val就是发送方所发送过来的数据
                console.log(val)

            })

        }
    }

</script>

         

                        ref引用

                                        ref可以在不依赖于 jQuery 的情况下,获取 DOM 元素或子组件实例,并且可以使用子组件实例中的属性与方法。

                                        【注】每一个实例都有属性 $refs

<template>
    
       <div>
            //给 this.$refs 添加一个属性 h1ref,值是h1这个Dom元素
            <h1 ref='h1ref'>  ref获取DOM元素h1  </h1>

            给 this.$refs 添加一个属性 Leftref,值是Left这个组件的实例
            <Left ref='Leftref'>   </Left>

        </div

</template>



<script>

    import Left from '@/components/Left.vue'

    export default {

        components: {
        
            Left,    
        
        },
        
        methods: {
            getElm() {

                //输出获取的DOM元素
                console.log(this.$refs.h1ref)

                //输出获取的Left实例
                console.log(this.$refs.Leftref)

            }
        }
    }

</script>

                      this.$nextTick(cb) 方法

                                作用:等组件的 DOM 更新完成之后,再执行 cb 回调函数。从而能保证 cb 回调函数可以操作到最新的 DOM 元素。

methods: {

    show() {

        this.$nextTick( () => {

            //函数体

        } )

    }
    
}