最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JSX在render函數(shù)中的應(yīng)用詳解

 更新時(shí)間:2019年09月04日 08:58:01   作者:前端優(yōu)選  
這篇文章主要介紹了JSX在render函數(shù)中的應(yīng)用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一.JSX簡(jiǎn)介

const element = <h1>Hello, world!</h1>;

JSX 可以很好地描述 UI 應(yīng)該呈現(xiàn)出它應(yīng)有交互的本質(zhì)形式。JSX 可能會(huì)使人聯(lián)想到模版語言,但它具有 JavaScript 的全部功能。

Babel 會(huì)把 JSX 轉(zhuǎn)譯成一個(gè)名為 React.createElement() 函數(shù)調(diào)用。

以下兩種示例代碼完全等效:

const element = (
 <h1 className="greeting">
  Hello, world!
 </h1>
);
const element = React.createElement(
 'h1',
 {className: 'greeting'},
 'Hello, world!'
);

React.createElement() 會(huì)預(yù)先執(zhí)行一些檢查,以幫助你編寫無錯(cuò)代碼,但實(shí)際上它創(chuàng)建了一個(gè)這樣的對(duì)象:

const element = {
 type: 'h1',
 props: {
  className: 'greeting',
  children: 'Hello, world!'
 }
};

二.模板缺陷

模板的最大特點(diǎn)是擴(kuò)展難度大,不易擴(kuò)展??赡軙?huì)造成邏輯冗余:

<Level :type="1">哈哈</Level>
<Level :type="2">哈哈</Level>
<Level :type="3">哈哈</Level>

Level組件需要對(duì)不同的type產(chǎn)生不同的標(biāo)簽

<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>

三.函數(shù)式組件

函數(shù)式組件沒有模板,只允許提供render函數(shù)

export default {
 render(h) {
 return h("h" + this.type, {}, this.$slots.default);
 },
 props: {
 type: {
  type: Number
 }
 }
};

復(fù)雜的邏輯變得非常簡(jiǎn)單

四.JSX應(yīng)用

使用jsx會(huì)讓代碼看起來更加簡(jiǎn)潔、易于讀取

export default {
 render(h) {
 const tag = "h" + this.type;
 return <tag>{this.$slots.default}</tag>;
 },
 props: {
 type: {
  type: Number
 }
 }
};

五.render方法定制組件

編寫List組件,可以根據(jù)用戶傳入的數(shù)據(jù)自動(dòng)循環(huán)列表

<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方法,就會(huì)想到可以編寫個(gè)函數(shù)組件,將createElement方法傳遞出來

<template>
 <div class="list">
 <div v-for="(item,index) in data" :key="index">
  <li v-if="!render">{{item}}</li>
  <!-- 將render方法傳到函數(shù)組件中,將渲染項(xiàng)傳入到組件中,在內(nèi)部回調(diào)這個(gè)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調(diào)用最外層的render方法,將createElement和當(dāng)前項(xiàng)傳遞出來

<script>
export default {
 props: {
 render: {
  type: Function
 },
 item: {}
 },
 render(h) {
 return this.render(h, this.item);
 }
};
</script>

六.scope-slot

使用v-slot 將內(nèi)部值傳入即可

<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擴(kuò)展成可編輯的表格

<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 ? 
     <i-input type="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>

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 微信小程序自定義底部彈出框動(dòng)畫

    微信小程序自定義底部彈出框動(dòng)畫

    這篇文章主要為大家詳細(xì)介紹了微信小程序自定義底部彈出框動(dòng)畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 全面兼容的javascript時(shí)間格式化函數(shù)(比較實(shí)用)

    全面兼容的javascript時(shí)間格式化函數(shù)(比較實(shí)用)

    這篇文章主要介紹了全面兼容比較實(shí)用的javascript時(shí)間格式化函數(shù),需要的朋友可以參考下
    2014-05-05
  • JavaScript forEach中return失效問題解決方案

    JavaScript forEach中return失效問題解決方案

    這篇文章主要介紹了JavaScript forEach中return失效問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 實(shí)例講解DataTables固定表格寬度(設(shè)置橫向滾動(dòng)條)

    實(shí)例講解DataTables固定表格寬度(設(shè)置橫向滾動(dòng)條)

    下面小編就為大家?guī)硪黄獙?shí)例講解DataTables固定表格寬度(設(shè)置橫向滾動(dòng)條)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • JavaScript中Form表單技術(shù)匯總(推薦)

    JavaScript中Form表單技術(shù)匯總(推薦)

    這篇文章主要介紹了JavaScript中Form表單技術(shù)的相關(guān)資料,包括簡(jiǎn)單的表單驗(yàn)證和正則表達(dá)式驗(yàn)證,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • JavaScript中常用的3種彈出提示框(alert、confirm、prompt)

    JavaScript中常用的3種彈出提示框(alert、confirm、prompt)

    這篇文章主要給大家介紹了關(guān)于JavaScript中常用的3種彈出提示框(alert、confirm、prompt)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 微信小程序?qū)崿F(xiàn)簡(jiǎn)單購物車小功能

    微信小程序?qū)崿F(xiàn)簡(jiǎn)單購物車小功能

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)簡(jiǎn)單購物車小功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • JS變量及其作用域

    JS變量及其作用域

    本文主要介紹了JS變量及其作用域的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-03-03
  • 深入理解Javascript作用域與變量提升

    深入理解Javascript作用域與變量提升

    這篇文章主要是對(duì)Javascript作用域與變量提升進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2013-12-12
  • js實(shí)現(xiàn)無縫滾動(dòng)特效

    js實(shí)現(xiàn)無縫滾動(dòng)特效

    這篇文章主要介紹了js實(shí)現(xiàn)無縫滾動(dòng)特效,結(jié)合已學(xué)知識(shí)進(jìn)行擴(kuò)展性練習(xí),感興趣的朋友可以參考一下
    2015-12-12

最新評(píng)論

甘德县| 兴国县| 原阳县| 洛川县| 剑川县| 康乐县| 新营市| 神池县| 武定县| 临邑县| 讷河市| 西乌| 邢台市| 宽甸| 广东省| 饶河县| 灵寿县| 金乡县| 全南县| 武功县| 新兴县| 介休市| 四会市| 竹北市| 玉环县| 泸溪县| 彰化县| 辽阳市| 麻城市| 泽普县| 怀来县| 来安县| 镇康县| 盐山县| 呼玛县| 新兴县| 三原县| 静宁县| 蒙城县| 建瓯市| 沾化县|