一.JSX简介
const element = <h1>Hello, world!</h1>;
JSX 可以很好地描述 UI 应该呈现出它应有交互的本质形式。JSX 可能会使人联想到模版语言,但它具有 JavaScript 的全部功能。
Babel 会把 JSX 转译成一个名为 React.createElement() 函数调用。
以下两种示例代码完全等效:
const element = ( <h1 className="greeting"> Hello, world! </h1> );
const element = React.createElement( 'h1', {className: 'greeting'}, 'Hello, world!' );
React.createElement() 会预先执行一些检查,以帮助你编写无错代码,但实际上它创建了一个这样的对象:
const element = { type: 'h1', props: { className: 'greeting', children: 'Hello, world!' } };
二.模板缺陷
模板的最大特点是扩展难度大,不易扩展。可能会造成逻辑冗余:
<Level :type="1">哈哈</Level> <Level :type="2">哈哈</Level> <Level :type="3">哈哈</Level>
Level组件需要对不同的type产生不同的标签
<template> <h1 v-if="type==1"> <slot></slot> </h1> <h2 v-else-if="type==2"> <slot></slot> </h2> <h3 v-else-if="type==3"> <slot></slot> </h3> </template> <script> export default { props: { type: { type: Number } } }; </script>
三.函数式组件
函数式组件没有模板,只允许提供render函数
export default { render(h) { return h("h" + this.type, {}, this.$slots.default); }, props: { type: { type: Number } } };
复杂的逻辑变得非常简单
四.JSX应用
使用jsx会让代码看起来更加简洁、易于读取
export default { render(h) { const tag = "h" + this.type; return <tag>{this.$slots.default}</tag>; }, props: { type: { type: Number } } };
五.render方法定制组件
编写List组件,可以根据用户传入的数据自动循环列表
<List :data="data"></List> <script> import List from "./components/List"; export default { data() { return { data: ["苹果", "香蕉", "橘子"] }; }, components: { List } }; </script> <!-- List组件渲染列表 --> <template> <div class="list"> <ul v-for="(item,index) in data" :key="index"> <li>{{item}}</li> </ul> </div> </template> <script> export default { props: { data: Array, default: () => [] } }; </script>
通过render方法来定制组件,在父组件中传入render方法
<List :data="data" :render="render"></List> render(h, name) { return <span>{name}</span>; }
我们需要createElement方法,就会想到可以编写个函数组件,将createElement方法传递出来
<template> <div class="list"> <div v-for="(item,index) in data" :key="index"> <li v-if="!render">{{item}}</li> <!-- 将render方法传到函数组件中,将渲染项传入到组件中,在内部回调这个render方法 --> <ListItem v-else :item="item" :render="render"></ListItem> </div> </div> </template> <script> import ListItem from "./ListItem"; export default { components: { ListItem }, props: { render: { type: Function }, data: Array, default: () => [] } }; </script>
ListItem.vue调用最外层的render方法,将createElement和当前项传递出来
<script> export default { props: { render: { type: Function }, item: {} }, render(h) { return this.render(h, this.item); } }; </script>
六.scope-slot
使用v-slot 将内部值传入即可
<List :arr="arr"> <template v-slot="{item}"> {{item}} </template> </List> <div v-for="(item,key) in arr" :key="key"> <slot :item="item"></slot> </div>
七.编写可编辑表格
基于iview使用jsx扩展成可编辑的表格
<template> <div> <Table :columns="columns" :data="data"></Table> </div> </template> <script> import Vue from 'vue'; export default { methods:{ render(h,{column,index,row}){ let value = row[column.key]; return <div on-click={(e)=>this.changeIndex(e,index)} > {this.index === index "text" value={value} on-input={(value)=>{ this.handleChange(value,column,row) }} onOn-enter={()=>this.enter(row,index)}/>: <span>{value}</span> } </div> }, enter(row,index){ this.data.splice(index,1,row); this.index = -1; }, handleChange(value,column,row){ row[column['key']]= value; }, changeIndex(e,index){ this.index = index; this.$nextTick(()=>{ e.currentTarget.getElementsByTagName("input")[0].focus(); }) } }, data() { return { index:-1, columns: [ { title: 'Name', key: 'name', render:this.render }, { title: 'Age', key: 'age', }, { title: 'Address', key: 'address', }, ], data: [ { name: 'John Brown', age: 18, address: 'New York No. 1 Lake Park', date: '2016-10-03', }, { name: 'Jim Green', age: 24, address: 'London No. 1 Lake Park', date: '2016-10-01', }, { name: 'Joe Black', age: 30, address: 'Sydney No. 1 Lake Park', date: '2016-10-02', }, { name: 'Jon Snow', age: 26, address: 'Ottawa No. 2 Lake Park', date: '2016-10-04', }, ], }; }, }; </script>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]