• Vue组件传


    跟禹神学vue--总结

    1 父组件给子组件传递参数--props传参

    (1)父组件中准备好数据

    1. data() {
    2. return {
    3. todos:[
    4. {id:'001',title:'01',done:true},
    5. {id:'002',title:'02',done:false},
    6. {id:'003',title:'03',done:true}
    7. ]
    8. }
    9. }

    (2)父组件中引入子组件(import + components),并传递参数

    1. <script>
    2. import MyList from './components/MyList'
    3. export default {
    4. name:'App',
    5. components:{MyList},
    6. }
    7. script>

    (3)子组件声明父组件传递的参数并接收使用

    1. <script>
    2. export default {
    3. name:'MyList',
    4. //声明接收父组件传递过来的数据
    5. props:['todos']
    6. }
    7. script>

    2 子组件给父组件传递参数--props传参

    (1)父组件中定义一个参数,回调留在父组件中

    1. methods: {
    2. //添加一个todo(子传父)
    3. addTodo(todoObj){
    4. // 数组开头放一个
    5. this.todos.unshift(todoObj)
    6. },
    7. }

    (2)父组件给子组件传递函数,供子组件调用并传参数

    (3)子组件声明接收并调用

    1. //接收从App传递过来的addTodo
    2. props:['addTodo'],
    1. // add方法
    2. add(){
    3. //校验数据
    4. if(!this.title.trim()) return alert('输入不能为空')
    5. //将用户的输入包装成一个todo对象
    6. const todoObj = {id:nanoid(),title:this.title,done:false}
    7. //通知App组件去添加一个todo对象
    8. this.addTodo(todoObj)
    9. //清空输入
    10. this.title = ''
    11. }
    12. },

    3、子组件给父组件传参--自定义事件

    (1)子组件定义一个事件,通过this.$emit传给父组件

    1. add() {
    2. //校验数据
    3. if (!this.title.trim()) return alert("输入不能为空");
    4. //将用户的输入包装成一个todo对象
    5. const todoObj = { id: nanoid(), title: this.title, done: false };
    6. //通知App组件去添加一个todo对象
    7. //this.addTodo(todoObj)
    8. //换成子给父传递数据,触发事件
    9. this.$emit("addTodo", todoObj);
    10. //清空输入
    11. this.title = "";
    12. },

    (2)父组件绑定子组件的自定义事件

    绑定事件的方式:

            方式一:v-on:自定义事件

            方式二:@自定义事件

    自定义事件实现方式一

    1. //添加一个todo
    2. addTodo(todoObj) {
    3. this.todos.unshift(todoObj);
    4. },

    自定义事件实现方式二

    1. methods:{
    2. //添加一个todo
    3. addTodo(todoObj) {
    4. this.todos.unshift(todoObj);
    5. },
    6. }
    7. mounted({
    8. this.$refs.acceptAddTodo.$on('addTodo',this.addTodo)
    9. }

    4、任意组件之间传参--全局事件总线

    (1)main.js全局安装事件总线

    1. //创建vm
    2. new Vue({
    3. el:'#app',
    4. render: h => h(App),
    5. beforeCreate() {
    6. Vue.prototype.$bus = this
    7. }
    8. })

    (2)接收方:接收的回调,并使用发送方传递过来的参数

    1. //勾选or取消勾选一个todo
    2. checkTodo(id) {
    3. this.todos.forEach((todo) => {
    4. if (todo.id === id) todo.done = !todo.done;
    5. });
    6. },
    7. //删除一个todo
    8. deleteTodo(id) {
    9. this.todos = this.todos.filter((todo) => todo.id !== id);
    10. },

    (3)接收方:通过this.$bus.$on(事件名,参数)接收参数,在mounted中声明接收

    1. mounted() {
    2. /*
    3. 全局事件总线接受MyIterm的参数
    4. */
    5. this.$bus.$on('checkTodo',this.checkTodo)
    6. this.$bus.$on('deleteTodo',this.deleteTodo)
    7. },

    (3)接收方:使用参数之后,在beforeDestroy中解绑事件

    1. beforeDestroy() {
    2. this.$off('checkTodo')
    3. this.$off('deleteTodo')
    4. }

    (4)发送方:通过this.$bus.$emit(事件名,参数)发送数据

    1. methods: {
    2. //勾选or取消勾选
    3. handleCheck(id){
    4. //通知App组件将对应的todo对象的done值取反
    5. this.$bus.$emit('checkTodo',id)
    6. },
    7. //删除
    8. handleDelete(id){
    9. if(confirm('确定删除吗?')){
    10. //通知App组件将对应的todo对象删除
    11. // this.deleteTodo(id)
    12. this.$bus.$emit('deleteTodo',id)
    13. }
    14. }
    15. },

    5、任意组件之间传参--消息订阅与发布

    (1)安装pubsub-js ,并导入

    1. npm i pubsub-js
    2. import PubSub from "pubsub-js";

    (2)订阅方(接收方),通过pubsub的subscribe方法接收参数

    1. methods:{
    2. // deleteTodo(msgName,id) 消息订阅与发送 不需要的数据拿_代表
    3. deleteTodo(_, id) {
    4. this.todos = this.todos.filter((todo) => todo.id !== id);
    5. },
    6. },
    7. mounted() {
    8. // 消息订阅与发送
    9. this.pubId = PubSub.subscribe.$on("deleteTodo", this.deleteTodo);
    10. },

    (3)订阅方(接收方),取消订阅

    1. beforeDestroy() {
    2. // 消息订阅与发送
    3. PubSub.unsubscribe.$on(this.pubId);
    4. },

    (4)发布方(发送方),发布消息

    1. //删除
    2. handleDelete(id) {
    3. if (confirm("确定删除吗?")) {
    4. //消息订阅与发送--发送方
    5. PubSub.publish("deleteTodo", id);
    6. }
    7. },

  • 相关阅读:
    Java异常学习
    Python-自动化测试面试
    基于SSM+Vue的体育馆管理系统的设计与实现
    基于SqlSugar的开发框架循序渐进介绍(7)-- 在文件上传模块中采用选项模式【Options】处理常规上传和FTP文件上传
    【LeetCode】单词规律
    Leetcode 16.07 最大数值
    银河麒麟服务器x86安装qemu虚拟机,并安装windows server 2019
    第十五章总结
    各种级数(调和、几何)总结
    LeetCode 2897. 对数组执行操作使平方和最大【贪心,位运算,哈希表】2301
  • 原文地址:https://blog.csdn.net/m0_54435916/article/details/134358231