Vue 脚手架中使用 render 函数

Vue的官方介绍
在这里插入图片描述
大致意思就是说 在render 函数中 通过 createElement 来创建Vnode 的虚拟 dom(Vue的核心思想虚拟dom)

在脚手架中的使用

新建renderDemo.vue ,index.js文件

<script>
export default {
  name: "renderDemo",
  data() {
    return {};
  },
  methods: {},
  created() {},
  render(createElement) {
    return createElement("div", "render 创建的Div");
  },
};
</script>

index.js

import Render from './renderDemo'
export { Render}

使用

<template>
  <div class="hello">
   <img alt="Vue logo" src="../assets/logo.png" />
     <render></render>
  </div>
</template>

<script>
 import {Render} from '@/components'
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  },
  components:{
    // RenderDemo,
    Render
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {
  margin: 40px 0 0;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: inline-block;
  margin: 0 10px;
}
a {
  color: #42b983;
}
</style>

页面显示:
在这里插入图片描述

注:

  1. 与methods ,created 等同一级
  2. 弃用 template 模板 创建dom (如果使用template会替换render中的内容)
  3. 使用了render 就必须有返回值否则会报错

这是官方的使用方法 更多使用可参考vue官网:https://cn.vuejs.org/v2/guide/render-function.html

官方的使用方法是通过createElement 去创建一个dom 节点 然后将内容返回
既然都是返回节点 也可以这样去实现



<script>
export default {
  name: "renderDemo",
  data() {
    return {};
  },
  methods: {},
  created() {},
  render() {
    return (
        <ul>
           <li>1</li>
           <li>2</li>
           <li>3</li>
           <li>4</li>
        </ul>
    ) 
  },
};
</script>


或者循环生成

<script>
export default {
  name: "renderDemo",
  data() {
    return {};
  },
  methods: {},
  created() {},
  render() {
    const List = [
      {
        name: "1",
      },
      {
        name: "2",
      },
      {
        name: "3",
      },
      {
        name: "4",
      },
    ];

    const LiMap = List.map((v, i) => {
      return <li key={i}>{v.name}</li>;
    });

    return <ul>{LiMap}</ul>;
  },
};
</script>

添加事件
<script>
export default {
  name: "renderDemo",
  data() {
    return {};
  },
  methods: {
    activateLasers() {
      console.log("点击了li");
    },
  },
  created() {},
  render() {
    const List = [
      {
        name: "1",
      },
      {
        name: "2",
      },
      {
        name: "3",
      },
      {
        name: "4",
      },
    ];

    const LiMap = List.map((v, i) => {
      return (
        <li key={i} onClick={this.activateLasers}>
          {v.name}
        </li>
      );
    });

    return <ul>{LiMap}</ul>;
  },
};
</script>


需要传递数据时(学过react的童鞋应该不陌生,这里就不过多解释了)



<script>
export default {
  name: "renderDemo",
  data() {
    return {};
  },
  methods: {
    activateLasers(i) {
      console.log(`第${i+1}个li`);
    },
  },
  created() {},
  render() {
    const List = [
      {
        name: "1",
      },
      {
        name: "2",
      },
      {
        name: "3",
      },
      {
        name: "4",
      },
    ];

    const LiMap = List.map((v, i) => {
      return (
        <li key={i} onClick={()=>this.activateLasers(i)}>
          {v.name}
        </li>
      );
    });

    return <ul>{LiMap}</ul>;
  },
};
</script>


v-model 和 v-show

<script>
export default {
  name: "renderDemo",
  data() {
    return {
      active: 0,
    };
  },
  methods: {
    activateLasers(i) {
      console.log(`点击了第${i + 1}li`);
      this.active = i;
    },
    nextClick() {},
  },
  created() {},
  render() {
    const List = [
      {
        name: "1",
      },
      {
        name: "2",
      },
      {
        name: "3",
      },
      {
        name: "4",
      },
    ];

    const LiMap = List.map((v, i) => {
      return (
        <li key={i} onClick={() => this.activateLasers(i)}>
          {v.name}
        </li>
      );
    });

    return (
      <ul>
        {LiMap}
        <input v-model={this.active} />
        <h1 v-show={this.active == 1}>输入为1或者点击第一个Li时显示</h1>
      </ul>
    );
  },
};
</script>


注:render函数不支持使用 v-if 等语法

可以使用 三目运算符 不能使用复杂判断 如if 和switch try


    return (
      <ul>
        {LiMap}
        <input v-model={this.active} />
        <h1 v-show={this.active == 1}>输入为1或者点击第一个Li时显示</h1>
        {this.active == 2 ? <h2>输入为2或者点击第二个Li时显示</h2> : ""}
      </ul>
    );

可以使用 map find some every等数组方法 不支持使用 for 循环

  return (
      <ul>
        {LiMap}
        <input v-model={this.active} />
        <h1 v-show={this.active == 1}>输入为1或者点击第一个Li时显示</h1>
        {this.active == 2 ? <h2>输入为2或者点击第二个Li时显示</h2> : ""}
        {
          List.map((v) => {
          if (v.name == "4") {
            return <h4>显示第四个Li</h4>;
          }
         })
        }
      </ul>
    );

个人理解:render 函数相对template 模板更加灵活,开阔程序的可变性, 一个复杂的功能点能够细分为多个, 使组件页面逻辑更加清晰,借鉴react 开发思维 , 更多是用于 功能性组件的封装

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值