vue渲染函数用法示例

一、插槽用法

1.使用渲染函数的写法,写一个带有插槽的组件SlotA,放在components文件夹下

复制代码
export default {
  props: {
    user: {
      type: Object,
      required: true,
    },
  },
  render(createElement) {
    return createElement(
      "div",
      {
        attrs: { //传递到div标签上的属性
          id: "foo",
        },
      },
      [
        createElement("header", this.$slots.header),// 具名插槽header
        createElement(
          "main",
          this.$scopedSlots.default({ //默认作用域插槽
            user: this.user, // 将 props 传递给插槽
          })
        ),
        createElement( 
          "content",
          this.$scopedSlots.content({// 作用域插槽content
            content: { des: "内容" }, // 将 props 传递给插槽
          })
        ),
        createElement(
          "footer",
          this.$scopedSlots.footer({// 作用域插槽content
            message: "Footer Message",
          })
        ),
      ]
    );
  },
};
  1. 引用组件

    <template>
    <SlotA :user="{ name: 'LUCY' }"> <template v-slot:default="{ user }"> {{ user.name }} </template> <template v-slot:header> 这是头部 </template> <template v-slot:content="{ content }"> {{ content.des }} </template> <template #footer="{ message }">

    {{ message }}

    </template> </SlotA>
    </template> <script> import SlotA from "./components/SlotA.js"; export default { SlotA } </script>

3.展示结果

二、父子组件通信

复制代码
import { VBtn } from 'vuetify/lib';
// 子组件
const ChildComponent = {
  props: ["parentMessage"],
  data() {
    return {
      childMessage: "Hello from Child!",
    };
  },
  methods: {
    sendMessageToParent() {
      this.$emit("childEvent", this.childMessage);
    },
  },
  render(h) {
    return h("div", [
      h("h2", "我是子组件"),
      h("p", `来自父组件的数据: ${this.parentMessage}`),
      h(
        VBtn,
        {
          props: {
            color: 'primary',
            depressed: true
          },
          on: {
            click: this.sendMessageToParent,
          },
        },
        "发送信息到父组件"
      ),
    ]);
  },
};
// 父组件
const ParentComponent = {
  data() {
    return {
      messageFromChild: "",
      parentMessage: "来自父组件的问候!",
    };
  },
  methods: {
    handleChildEvent(message) {
      this.messageFromChild = message;
    },
  },
  render(h) {
    return h("div", [
      h("h1", "我是父组件"),
      h(ChildComponent, {
        props: {
          parentMessage: this.parentMessage,
        },
        on: {
          childEvent: this.handleChildEvent,
        },
      }),
      h("p", `来自子组件的消息: ${this.messageFromChild}`),
    ]);
  },
};
export default ParentComponent;

运行结果:

三、attrs和listeners的使用

复制代码
import { VBtn } from 'vuetify/lib';
// 父组件
const ParentComponent = {
    data() {
      return {
        messageFromChild: '',
        parentMessage: 'Hello from Parent!'
      };
    },
    methods: {
      handleChildEvent(message) {
        this.messageFromChild = message;
      },
      handleCustomEvent() {
        alert('Custom event triggered from child!');
      },
      handleClick() {
        alert('父组件的点击事件');
      }
    },
    render(h) {
      return h('div', [
        h('h1', 'Parent Component'),
        h('p', `Message from Child: ${this.messageFromChild}`),
        h(ChildComponent, {
          props: {
            parentMessage: this.parentMessage
          },
          attrs: {
            customAttribute: 'This is a custom attribute'
          },
          on: {
            childEvent: this.handleChildEvent,
            customEvent: this.handleCustomEvent,
            click: this.handleClick
          }
        })
      ]);
    }
  };

  // 子组件
const ChildComponent = {
    props: ['parentMessage'],
    data() {
      return {
        childMessage: 'Hello from Child!'
      };
    },
    methods: {
      sendMessageToParent() {
        this.$emit('childEvent', this.childMessage);
      },
      triggerCustomEvent() {
        this.$emit('customEvent');
      }
    },
    render(h) {
      return h('div', [
        h('h2', 'Child Component'),
        h('p', `Message from Parent: ${this.parentMessage}`),
        h('p', `Custom Attribute: ${this.$attrs.customAttribute}`), // 使用 $attrs
        h(VBtn, {
          on: {
            click: this.sendMessageToParent
          }
        }, 'Send Message to Parent'),
        h(VBtn, {
          on: {
            click: this.triggerCustomEvent
          }
        }, 'Trigger Custom Event'),
        h(VBtn, {
          on: {
            click: this.$listeners.click
          }
        }, '父组件的点击事件'),
        // 将 $attrs 和 $listeners 传递给更深层次的组件
        h(GrandChildComponent, {
          attrs: this.$attrs,
          on: this.$listeners
        })
      ]);
    }
  };
  
  // 更深层次的子组件
  const GrandChildComponent = {
    render(h) {
      return h('div', [
        h('h3', 'GrandChild Component'),
        h('p', `Custom Attribute from Parent: ${this.$attrs.customAttribute}`), // 使用 $attrs
        h(VBtn, {
          on: {
            click: () => this.$emit('customEvent') // 使用 $listeners
          }
        }, 'Trigger Custom Event from GrandChild')
      ]);
    }
  };
  export default ParentComponent;

四、指令的用法

1.定义一个指令,该指令的含义是,在一个按钮上应用v-ajax指令,当点击该按钮时,会发送一个ajax请求。该指令接收两个参数,url和name,同时还具有arg及modifiers两个属性的使用示例。如果使用模板语法来示意,如下:

复制代码
<button v-ajax:GET.log.alert="{name:'访问',url:'http://xxxx.com/api'}">点击发送</button>

Vue.directive('ajax', {
  bind(el, binding) {
    const { url, name } = binding.value; // 解构出 url 和 name
    const method = binding.arg || 'GET'; // 使用 arg 指定请求方法,默认为 GET
    const { log, alert } = binding.modifiers; // 使用 modifiers 判断是否需要日志或弹窗

    el.addEventListener('click', async () => {
      try {
        if (log) {
          console.log(`[${name}] Sending ${method} request to ${url}`);
        }

        const response = await fetch(url, {
          method: method // 使用 arg 指定的请求方法
        });

        const data = await response.json();

        if (log) {
          console.log(`[${name}] Request successful! Response:`, data);
        }

        if (alert) {
          alert(`${name}: Request successful! Response: ${JSON.stringify(data)}`);
        }
      } catch (error) {
        if (log) {
          console.error(`[${name}] Request failed! Error:`, error);
        }

        if (alert) {
          alert(`${name}: Request failed! Error: ${error.message}`);
        }
      }
    });
  },
  unbind(el) {
    // 清理事件监听器
    el.removeEventListener('click');
  }
});

2.使用指令

复制代码
const App = {
  render(h) {
    return h('div', [
      h('h1', 'Custom Directive Example'),
      h('button', {
        directives: [
          {
            name: 'ajax',
            value: {
              url: 'https://jsonplaceholder.typicode.com/todos/1', // 请求的 URL
              name: 'Fetch Todo' // 请求的名称
            },
            arg: 'GET', // 指定请求方法
            modifiers: {
              log: true, // 启用日志
              alert: true // 启用弹窗
            }
          }
        ]
      }, 'Fetch Data')
    ]);
  }
};
相关推荐
灵感__idea6 小时前
Hello 算法:贪心的世界
前端·javascript·算法
GreenTea7 小时前
一文搞懂Harness Engineering与Meta-Harness
前端·人工智能·后端
killerbasd9 小时前
牧苏苏传 我不装了 4/7
前端·javascript·vue.js
吴声子夜歌9 小时前
ES6——二进制数组详解
前端·ecmascript·es6
码事漫谈9 小时前
手把手带你部署本地模型,让你Token自由(小白专属)
前端·后端
ZC跨境爬虫9 小时前
【爬虫实战对比】Requests vs Scrapy 笔趣阁小说爬虫,从单线程到高效并发的全方位升级
前端·爬虫·scrapy·html
爱上好庆祝9 小时前
svg图片
前端·css·学习·html·css3
橘子编程10 小时前
JavaScript与TypeScript终极指南
javascript·ubuntu·typescript
王夏奇10 小时前
python中的__all__ 具体用法
java·前端·python
叫我一声阿雷吧10 小时前
JS 入门通关手册(45):浏览器渲染原理与重绘重排(性能优化核心,面试必考
javascript·前端面试·前端性能优化·浏览器渲染·浏览器渲染原理,重排重绘·reflow·repaint