Vue2.0 Vue脚手架 组件自定义事件_绑定

组件的自定义事件

自定义事件就是区别于JS里面内置事件而存在的:

  • 比如点击事件click
  • 键盘事件keyup

内置事件是给html元素用的;而自定义事件是给组件用的

准备俩个组件

School.vue

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

<script>
    export default{
        name: 'School',
        components:{},
        data(){
            return{
                name: 'bilibili',
                address: '魔都'
            }
        },
    }
</script>

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

Student.vue

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

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

<style scoped>
    .studentBack{
        background-color: pink;
    }
</style>

引入App.vue

<template>
    <div class="appBack">
        <h1>{{msg}}</h1>
        <School />
        <hr />
        <Student />
    </div>
</template>

<script>
    import School from './components/School.vue'
    import Student from './components/Student.vue'
    export default{
        name: 'App',
        components:{School,Student},
        data() {
            return {
                msg: '你好啊!'
            }
        },
    }
</script>

<style>
    .appBack{
        background-color: gray;
    }
</style>

接下来提出需求

就是School组件在最下面设计一个按钮,这个按钮功能是点击这个按钮把这个学校名就交给App组件

子组件给父组件传值,可以用props但是有一个前提就是父组件提前给字组件一个函数,子组件在合适的时候调用该函数:

App.vue

<template>
    <div class="appBack">
        <h1>{{msg}}</h1>
        <School :getSchoolName="getSchoolName"/>
        <hr />
        <Student />
    </div>
</template>

<script>
    import School from './components/School.vue'
    import Student from './components/Student.vue'
    export default{
        name: 'App',
        components:{School,Student},
        data() {
            return {
                msg: '你好啊!'
            }
        },
        methods: {
            getSchoolName(name){
                console.log('App收到了学校名:',name)
            }
        },
    }
</script>

给完之后School.vue得声明函数:

School.vue

<template>
    <div class="schoolBack">
        <h2>学校名称:{{name}}</h2>
        <h2>学校地址:{{address}}</h2>
        <button @click="sendSchoolName">把学校名给自己的父组件App</button>
    </div>
</template>

<script>
    export default{
        name: 'School',
        components:{},
        props:['getSchoolName'],
        data(){
            return{
                name: 'bilibili',
                address: '魔都'
            }
        },
        methods: {
            sendSchoolName(){
                this.getSchoolName(this.name)      
            }
        },
    }
</script>

同样的功能,也想给Student.vue一份,把学生名给App但是

用自定义事件去写

App.vue

<Student v-on:bilibili="demo"/>

首先我们必须认可一件事v-on在谁身上就是给谁绑定事件

由于v-on在Student这个组件标签上,所以说是给Student这个组件的实例对象(VueComponent)上绑定了一个事件,事件名称叫bilibili,如果以后有人触发了这个事件那么以后demo函数就会被调用

demo(){
	console.log('demo被调用了')
}

那么bilibili这个事件得怎么触发呢?

里面有一个原则:你给谁绑的事件,你就找谁触发事件去

比如我按下click就给我调用demo()函数

这个给Student组件的实例对象绑定的bilibili事件。想要触发就直接找Student这个组件的实例对象

Student.vue

<template>
    <div class="studentBack">
        <h2>学生姓名:{{name}}</h2>
        <h2>学生性别:{{sex}}</h2>
        <button @click="sendStudentName">把姓名给自己的父组件App</button>
    </div>
</template>

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

在这个sendStudentName()函数里面我就想触发bilibili事件

之前说是吧bilibili给了Student实例对象上,所以要找也是去Student的组件实例对象身上(VueComponent)

Student.vue里可以轻而易举的拿到这个实例对象(VueComponent),用this;但接下来的问题是,你怎么触发:

借助一个特殊的方法,这个方法名字叫做$emit(没有触发的意思,它的本意是爆发、发射),虽然没有触发的含义,但是我们可以想成是触发;它是个函数$emit()里面的实参就是你想要触发哪个事件(这里是this.$emit('bilibili')),要传数据this.$emit('bilibili',this.name),整体:

<template>
    <div class="studentBack">
        <h2>学生姓名:{{name}}</h2>
        <h2>学生性别:{{sex}}</h2>
        <button @click="sendStudentName">把姓名给自己的父组件App</button>
    </div>
</template>

<script>
    export default{
        name: 'Student',
        components:{},
        data() {
            return {
                name: '张三',
                sex: '男'
            }
        },
        methods: {
            sendStudentName(){
                //触发Student组件实例身上的bilibili事件
                this.$emit('bilibili',this.name)
            }
        },
    }
</script>

App.vue

demo(name){
	console.log('demo被调用了',name)
}

这俩个都是子组件给父组件传值

这俩个的共同点就是:都要在父组件配置一个回调函数

自定义的优点就是你不用在这里用props自己去收,收完在用

另一种写法:

<Student ref="student"/>

一写这个你就要知道你能用this.$refs.student我就可以获取到Student这个组件的实例对象

App.vue

mounted(){//只要在哪个组件里面就意味着哪个组件挂载完毕
	this.$refs.student
}

this.$refs.student这就是Student的组件实例对象,接下来就可以绑定事件了,随后调一个方法$on(当什么什么时候)

$on()里的参数:

  • 第一个参数:什么事件被触发的时候,写成字符形式
  • 第二个参数:当触发的时候我要执行一个回调:
methods: {
            getSchoolName(name){
                console.log('App收到了学校名:',name)
            },
            demo(name){
                console.log('demo被调用了',name)
            }
        },
mounted() {
	this.$refs.student.$on('bilibili',this.demo)
},

这样你可以实现同样的效果

这种方法虽然麻烦,但灵活性很强

第一种@或者v-on的写法,只要模板一解析瞬间就绑完了

如果的需求是等三秒ajax请求发送完回来我再给你绑定自定义事件。第二种就可以

mounted() {
    setTimeout(()=>{
    	this.$refs.student.$on('bilibili',this.demo)
	},3000)
},

如果没有这种需求可以选择第一种方法

这里面还涉及到另外一个事

就是有些时候,我想让我这个自定义事件触发一次之后就不能再触发了,那怎么写:

如果是以第二种方式去写,你可以考虑换一个API($once)

this.$refs.student.$once('bilibili',this.demo)

如果你用的是第二种方式

<Student v-on:bilibili.once="demo"/>

这里还是涉及到一个问题(传多数据)

当我去触发这个事件的时候,我想传很多参数

Student.vue

sendStudentName(){
    //触发Student组件实例身上的bilibili事件
	this.$emit('bilibili',this.name,666,888,900)
}

App.vue

demo(name,x,y,z){
	console.log('demo被调用了',name,x,y,z)
}

但一般中我们不会给这么多形参去接,如果传递的之很多,有俩种做法:

  • 把传递的参数(比如Student.vue里的666,888,900)包装成一个对象

  • 在接收的地方(比如App.vue里的demo())无论传了多少值以...随便去一个名字(比如...a)也就是剩余的全都存到a这个数组身上(一般用params(参数))

    demo(name,...a){
    	console.log('demo被调用了',name,a)
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要在Vue 3项目创建自定义指令,可以按照以下步骤操作: 1. 创建一个Vue 3项目。 2. 在需要使用自定义指令的组件,可以通过在 `setup()` 函数使用 `directive()` 方法来创建自定义指令。 例如,以下代码演示了如何创建一个名为 "focus" 的自定义指令,该指令可以让元素在加载时自动获得焦点: ```javascript import { directive } from 'vue' export const focus = directive((el) => { el.focus() }) ``` 在上面的代码,我们使用了Vue 3的 `directive()` 方法来创建一个名为 "focus" 的自定义指令。该方法需要接收一个回调函数,该回调函数会在指令被绑定到元素上时被调用。在上面的例子,我们在回调函数调用了 `el.focus()` 方法,以便在元素加载时将焦点设置为该元素。 3. 在需要使用自定义指令的组件,可以使用 `v-{指令名}` 的语法来将自定义指令绑定到元素上。例如,在以下代码,我们将名为 "focus" 的自定义指令绑定到一个文本框上: ```html <template> <input v-focus /> </template> <script> import { focus } from './directives' export default { directives: { focus } } </script> ``` 在上面的代码,我们使用了 `v-focus` 的语法来将名为 "focus" 的自定义指令绑定到一个文本框上。同时,在组件的 `directives` 选项,我们也将 "focus" 自定义指令注册为该组件可用的指令。 这样,当该组件被加载时,文本框就会自动获得焦点,因为我们在自定义指令的回调函数设置了 `el.focus()`。 ### 回答2: Vue 3脚手架创建自定义指令非常简单。首先,我们需要创建一个新项目并进入该项目的目录。然后,我们可以使用命令`vue create`来初始化一个新的Vue项目。接下来,系统会提示您选择一些配置选项,您可以根据自己的需要进行选择。 创建项目后,我们可以在项目的`src`文件夹找到`main.js`文件。在这个文件,我们可以通过`app.directive`方法来创建自定义指令。在这个方法,我们需要传入两个参数:指令的名称和一个对象,其包含指令的各种属性和钩子函数。 例如,我们可以创建一个自定义指令,用于让一个元素在鼠标悬停时改变背景颜色。在`main.js`文件,我们可以添加如下代码: ```javascript app.directive('hover-bg', { mounted(el) { el.addEventListener('mouseenter', () => { el.style.backgroundColor = 'blue'; }); el.addEventListener('mouseleave', () => { el.style.backgroundColor = 'white'; }); } }); ``` 上面的代码创建了一个名为`hover-bg`的指令,它使用`mounted`钩子函数来添加鼠标悬停事件监听器。当鼠标进入元素时,背景颜色会变为蓝色,当鼠标离开元素时,背景颜色会变为白色。您可以根据自己的需求修改指令的行为。 创建了自定义指令后,我们可以在组件使用它。例如,在一个组件的模板,我们可以将指令应用于一个元素: ```html <template> <div v-hover-bg>Hello, world!</div> </template> ``` 上面的代码将`hover-bg`指令应用于一个`div`元素,这个`div`元素将在鼠标悬停时改变背景颜色。 总结来说,使用Vue 3脚手架创建自定义指令非常简单。只需在`main.js`文件使用`app.directive`方法创建指令,并在模板应用指令即可。希望这个回答对您有帮助! ### 回答3: 在Vue3,可以通过创建自定义指令来扩展Vue的功能。下面是使用Vue3脚手架创建自定义指令的步骤: 首先,使用Vue3脚手架创建一个新的Vue项目。 在项目创建一个新的文件,命名为directive.js。 在directive.js文件,定义你的自定义指令。例如,可以创建一个自定义的v-focus指令来使元素获得焦点。代码如下: ``` import { Directive } from 'vue'; const focusDirective = { mounted(el) { el.focus(); } }; const app = Vue.createApp({}); app.directive('focus', focusDirective); export default app; ``` 在主组件,通过import语句引入directive.js文件。 使用v-focus指令将指定元素绑定到指令上。例如,可以在模板的一个input元素上使用v-focus指令: ```html <template> <div> <input v-focus> </div> </template> ``` 以上就是使用Vue3脚手架创建自定义指令的简单示例。你可以在directive.js文件定义其他自定义指令,然后在模板使用它们来扩展Vue的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

结城明日奈是我老婆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值