使用Vue脚手架2

ref属性

src/components/SchoolName.vue

<template>
    <div class="school">
        <h2>学校名称:{
   
   {name}}</h2>
        <h2>学校地址:{
   
   {address}}</h2>
    </div>
</template>

<script>
    export default {
        name:'SchoolName',
        data() {
            return {
                name:'黑马',
                address:'广州'
            }
        },
    }
</script>

<style>
    .school{
        background-color: orange;
    }
</style>

 src/App.vue

<template>
    <div>
        <h1 v-text="msg" ref="title"></h1>
        <button ref="btn" @click="showDOM">点我输出上方的DOM元素</button>
        <SchoolName ref="sch"/>
    </div>
</template>

<script>
// 引入School组件
import SchoolName from './components/School.vue'

export default {
    name: 'App',
    data(){
        return{
            msg:'欢迎学习Vue!'
        }
    },
    components: { SchoolName },
    methods:{
        showDOM(){
            console.log(this);
            console.log(this.$refs.title);//真实DOM元素
            console.log(this.$refs.btn);//真实DOM元素
            console.log(this.$refs.sch);//School组件的实例对象
        }
    }
}
</script>

 

props配置项

src/App.vue

<template>
    <div>
        <StudentName name="李四" sex="女" /><hr/>
        <StudentName name="王五" sex="男" :age="18"/><hr/>
    </div>
</template>

<script>
// 引入School组件
import StudentName from './components/StudentName'

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

src/components/StudentName.vue

<template>
    <div>
        <h1>{
   
   { msg }}</h1>
        <h2>学生姓名:{
   
   { name }}</h2>
        <h2>学生性别:{
   
   { sex }}</h2>
        <h2>学生年龄:{
   
   { myAge+1 }}</h2>
        <button @click="updateAge">尝试修改到的年龄</button>
    </div>
</template>

<script>
export default {
    name: 'StudentName',
    data() {
        return {
            msg: '我是一个尚硅谷的学生',
            myAge: this.age
        }
    },
    methods:{
        updateAge(){
            this.myAge++;
        }
    },
    // 1.简单声明接收
    // props:[
    //     'name','sex','age'
    // ]

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

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

 

注意:当props中与当前组件配置同名时,props中的配置优先级高于当前组件 

mixin混入

1.组件和混入对象含有同名选项时,这些选项将以恰当的方式进行“合并”,在发生冲突时以组件优先

var mixin={
    data:function(){
        return{
            message:'hello',
            foo:'abc
        }
    }
}

new Vue({
    mixins:[mixin],
    data(){
        return{
            message:'goodbye',
            bar:'def'
        }
    },
    created(){
        console.log(this.$data)
        // =>{message:"ggodbye",foo:"abc",bar:"def"}
    }

})

 2.同名生命周期函数将合并为一个数组,都会被调用。另外,混入对象的生命周期函数将在自身生命周期函数之前调用

var mixin={
    created(){
        console.log('混入对象的钩子被调用')
    }
}

new Vue({
    mixins:[mixin],
    created(){
        console.log('组件钩子被调用')
    }
})

// =>"混入对象的钩子被调用"
// =>"组件钩子被调用"

src/mixin.js

export const hunhe={
    methods:{
        showName(){
            alert(this.name);
        }
    },
    mounted(){
        console.log('你好啊');
    }
}

export const hunhe2={
    data(){
        return {
            x:100,
            y:200
        }
    }
}

src/components/School.vue

<template>
    <div>
        <h2 @click="showName">学校名称:{
   
   { name }}</h2>
        <h2>学校地址:{
   
   { address }}</h2>
    </div>
</template>

<script>
import {hunhe,hunhe2} from '../mixin'
export default {
    name: 'School',
    data() {
        return {
            name:'黑马',
            address:'广州',
            x:666
        }
    },
    mixins:[hunhe,hunhe2]//局部混入
}
</script>

src/components/Student.vue

<template>
    <div>
        <h2 @click="showName">学生姓名:{
   
   { name }}</h2>
        <h2>学生性别:{
   
   { sex }}</h2>
    </div>
</template>

<script>
import {hunhe,hunhe2} from '../mixin'
export default {
    name: 'Student',
    data() {
        return {
            name:'张三',
            sex:'男'
        }
    },
    mixins:[hunhe,hunhe2]//局部混入
}
</script>

src/App.vue

<template>
    <div>
        <Student/>
        <hr/>
        <School/>
    </div>
</template>

<script>
import Student from './components/Student'
import School from './components/School'

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

src/main.js

import Vue from 'vue'
import App from './App.vue'
import { hunhe } from './mixin'

// import {mixin} from './mixin'
Vue.config.productionTip = false

// Vue.mixin(hunhe)  //全局混合引入
// Vue.mixin(hunhe2) //全局混合引入
new Vue({
    el: '#app',
    render: h => h(App)
})

plugin插件

src/plugins.js 

export default {
    install(Vue,x,y,z){
        console.log(x,y,z)
        // 全局过滤器
        Vue.filter('mySlice',function(value){
            return value.slice(0,4)
        })


        // 定义全局指令
        Vue.directive('fbind',{
            // 指令与元素成功绑定时
            bind(element,binding){
                element.value=binding.value
            },
            // 指令所在元素被插入页面时
            inserted(element,binding){
                element.focus()
            },
            // 指令所在的模板被重新解析时
            update(element,binding){
                element.value=binding.value
            }
        })

        // 定义混入
        Vue.mixin({
            data(){
                return{
                    x:100,
                    y:200
                }
            }
        })

        // 给Vue原型上添加一个方法(vm和vc都能用
        Vue.prototype.hello=()=>{
            alert('你好啊')
        }
    }
}

src/main.js

import Vue from 'vue'
import App from './App.vue'

import plugins from './plugins.js'
Vue.config.productionTip = false

//应用插件
Vue.use(plugins,1,2,3)
//创建vm
new Vue({
    el: '#app',
    render: h => h(App)
})

src/components/School.vue

<template>
    <div>
        <h2>学校名称:{
   
   { name|mySlice }}</h2>
        <h2>学校地址:{
   
   { address }}</h2>
        <button @click="test">点我测试一个hello方法</button>
    </div>
</template>

<script>
export default {
    name: 'School',
    data() {
        return {
            name:'黑马',
            address:'广州'
        }
    },
    methods:{
        test(){
            this.hello()
        }
    }
}
</script>

src/components/Student.vue

<template>
    <div>
        <h2>学生姓名:{
   
   { name }}</h2>
        <h2>学生性别:{
   
   { sex }}</h2>
        <input type="text" v-bind:value="name"/>
    </div>
</template>

<script>
export default {
    name: 'Student',
    data() {
        return {
            name:'张三',
            sex:'男'
        }
    }
}
</script>

src/App.vue

<template>
    <div>
        <Student/>
        <hr/>
        <School/>
    </div>
</template>

<script>
import Student from './components/Student'
import School from './components/School'

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

scoped样式

查看版本npm view webpack versions

src/components/Student.vue

<template>
    <div class="demo">
        <h2 class="title">学生姓名:{
   
   { name }}</h2>
        <h2 class="atguigu">学生性别:{
   
   { sex }}</h2>
    </div>
</template>

<script>
export default {
    name: 'Student',
    data() {
        return {
            name:'张三',
            sex:'男'
        }
    }
}
</script>

<style lang="less">
    .demo{
        background-color: pink;
        .atguigu{
            font-size: 40px;
        }
    }
</style>

src/components/School.vue

<template>
    <div class="demo">
        <h2 class="title">学校名称:{
   
   { name}}</h2>
        <h2>学校地址:{
   
   { address }}</h2>
    </div>
</template>

<script>
export default {
    name: 'School',
    data() {
        return {
            name:'黑马',
            address:'广州'
        }
    }
}
</script>

<style scoped>
    .demo{
        background-color: skyblue;
    }
</style>

src/App.vue

<template>
    <div>
        <h1 class="title">你好啊</h1>
        <Student/>
        <School/>
    </div>
</template>

<script>
import Student from './components/Student'
import School from './components/School'

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

<style scoped>
    .title{
        background-color: red;
    }
</style>

猜你喜欢

转载自blog.csdn.net/bubbleJessica/article/details/131565319