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

vue中的render函數(shù)、h()函數(shù)、函數(shù)式組件詳解

 更新時(shí)間:2023年02月09日 08:30:02   作者:奧特曼  
在vue中我們使用模板HTML語(yǔ)法來(lái)組建頁(yè)面的,使用render函數(shù)我們可以用js語(yǔ)言來(lái)構(gòu)建DOM,這篇文章主要介紹了vue中的render函數(shù)、h()函數(shù)、函數(shù)式組件,需要的朋友可以參考下

一、什么是render

官網(wǎng):用于編程式地創(chuàng)建組件虛擬 DOM 樹的函數(shù)。

在我們使用webpack腳手架創(chuàng)建項(xiàng)目時(shí),都能在main.js中看到一個(gè)render函數(shù)

import Vue from 'vue'
import App from './App.vue'
 
new Vue({
  render: h => h(App)
}).$mount('#app')

對(duì)于render函數(shù) es6中寫成了箭頭函數(shù) 

es5寫法:

render: function (createElement) {
    return createElement(App);
}

實(shí)際上createElement只是形參用h代表了,h() 是 hyperscript 的簡(jiǎn)稱——意思是“能生成 HTML (超文本標(biāo)記語(yǔ)言) 的 JavaScript”。這個(gè)名字來(lái)源于許多虛擬 DOM 實(shí)現(xiàn)默認(rèn)形成的約定。一個(gè)更準(zhǔn)確的名稱應(yīng)該是 createVnode(),但當(dāng)你需要多次使用渲染函數(shù)時(shí),一個(gè)簡(jiǎn)短的名字會(huì)更省力。

二、vue中的render

字符串模板的代替方案,允許你發(fā)揮 JavaScript 最大的編程能力。該渲染函數(shù)接收一個(gè) createElement 方法作為第一個(gè)參數(shù)用來(lái)創(chuàng)建 VNode。

如果組件是一個(gè)函數(shù)組件,渲染函數(shù)還會(huì)接收一個(gè)額外的 context 參數(shù),為沒有實(shí)例的函數(shù)組件提供上下文信息。

Vue 選項(xiàng)中的 render 函數(shù)若存在,則 Vue 構(gòu)造函數(shù)不會(huì)從 template 選項(xiàng)或通過 el 選項(xiàng)指定的掛載元素中提取出的 HTML 模板編譯渲染函數(shù)。

h()函數(shù)用法還是比較多的

// 除了類型必填以外,其他的參數(shù)都是可選的
h('div')
h('div', { id: 'foo' })
 
// attribute 和 property 都能在 prop 中書寫
// Vue 會(huì)自動(dòng)將它們分配到正確的位置
h('div', { class: 'bar', innerHTML: 'hello' })
 
// props modifiers such as .prop and .attr can be added
// with '.' and `^' prefixes respectively
h('div', { '.name': 'some-name', '^width': '100' })
 
// 類與樣式可以像在模板中一樣
// 用數(shù)組或?qū)ο蟮男问綍鴮?
h('div', { class: [foo, { bar }], style: { color: 'red' } })
 
// 事件監(jiān)聽器應(yīng)以 onXxx 的形式書寫
h('div', { onClick: () => {} })
 
// children 可以是一個(gè)字符串
h('div', { id: 'foo' }, 'hello')
 
// 沒有 props 時(shí)可以省略不寫
h('div', 'hello')
h('div', [h('span', 'hello')])
 
// children 數(shù)組可以同時(shí)包含 vnodes 與字符串
h('div', ['hello', h('span', 'hello')])

得到的 vnode 為如下形式:

const vnode = h('div', { id: 'foo' }, [])
 
vnode.type // 'div'
vnode.props // { id: 'foo' }
vnode.children // []
vnode.key // null

當(dāng)然我們常見的template的形式(Vue 的模板)實(shí)際上被編譯成了渲染函數(shù)。

export default { 
    render (h) {
        const p = h('p', 'hi')
        return h('div', { class: 'red' }, [p, p])
      }
}

三、函數(shù)式組件

函數(shù)式組件是一種定義自身沒有任何狀態(tài)的組件的方式。它們很像純函數(shù):接收 props,返回 vnodes。函數(shù)式組件在渲染過程中不會(huì)創(chuàng)建組件實(shí)例 (也就是說,沒有 this),也不會(huì)觸發(fā)常規(guī)的組件生命周期鉤子。

官網(wǎng)函數(shù)式組件格式:

當(dāng)一個(gè)組件沒有管理任何狀態(tài),也沒有監(jiān)聽任何傳遞給它的狀態(tài),也沒有生命周期方法。實(shí)際上,它只是一個(gè)接受一些 prop 的函數(shù)。在這樣的場(chǎng)景下,我們可以將組件標(biāo)記為 functional,這意味它無(wú)狀態(tài) (沒有響應(yīng)式數(shù)據(jù)),也沒有實(shí)例 (沒有 this 上下文)。一個(gè)函數(shù)式組件就像這樣:

export default Vue.component('render-component', { // 該組件抽成js文件,
  functional: true,
  // 提供第二個(gè)參數(shù)作為上下文
  render: function (createElement, context) {
    return createElement('h1', '我是函數(shù)式子組件')
  }
})

組件需要的一切都是通過 context 參數(shù)傳遞,它是一個(gè)包括如下字段的對(duì)象:

  • props:提供所有 prop 的對(duì)象
  • children:VNode 子節(jié)點(diǎn)的數(shù)組
  • slots:一個(gè)函數(shù),返回了包含所有插槽的對(duì)象
  • scopedSlots:(2.6.0+) 一個(gè)暴露傳入的作用域插槽的對(duì)象。也以函數(shù)形式暴露普通插槽。
  • data:傳遞給組件的整個(gè)數(shù)據(jù)對(duì)象,作為 createElement 的第二個(gè)參數(shù)傳入組件
  • parent:對(duì)父組件的引用
  • listeners:(2.3.0+) 一個(gè)包含了所有父組件為當(dāng)前組件注冊(cè)的事件監(jiān)聽器的對(duì)象。這是 data.on 的一個(gè)別名。
  • injections:(2.3.0+) 如果使用了 inject 選項(xiàng),則該對(duì)象包含了應(yīng)當(dāng)被注入的 property。

函數(shù)式組件可以像普通組件一樣被注冊(cè)和使用。如果你將一個(gè)函數(shù)作為第一個(gè)參數(shù)傳入 h,它將會(huì)被當(dāng)作一個(gè)函數(shù)式組件來(lái)對(duì)待。

補(bǔ)充 h函數(shù)使用場(chǎng)景

button.vue

<script>
export default {
  props: {
    type: {
      type: String,
      default: 'normal'
    },
    text: {
      type: String,
      default: 'normal'
    },
    size: {
      type: String,
      default: 'medium'
    }
  },
  computed: {
    tag () {
      switch (this.type) {
        case 'success':
          return 1
        case 'danger':
          return 2
        case 'warning':
          return 3
        default:
          return 1
      }
    }
  },
  render (h) {
    return h('div', {
      class: {
        btn: true,
        buttom: 'name',
        'btn-success': this.type === 'success',
        'btn-danger': this.type === 'danger',
        'btn-warning': this.type === 'warning',
        'btn-mini': this.size === 'mini',
        'btn-small': this.size === 'small',
        'btn-medium': this.size === 'medium'
      },
      domProps: {
        innerText: this.text
      },
      on: {
        click: this.handleClick
      }
    })
  },
  methods: {
    handleClick () {
      console.log('button')
    }
  }
}
</script>
 
<style lang="less" scoped>
.buttom {
  padding: 10px 0;
  margin: 5px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 10px;
}
 
.buttom:hover {
  background: #c9c9c9;
}
 
.btn-success {
  background: #48ff8b;
  color: #fff;
}
 
.btn-danger {
  background: #ff4848;
  color: #fff;
}
 
.btn-warning {
  background: #ffbf48;
  color: #fff;
}
 
.btn-small {
  width: 120px;
  height: 20px;
}
 
.btn-medium {
  width: 120px;
  height: 30px;
}
 
.btn-mini {
  width: 120px;
  height: 10px;
}
</style>

使用

    <Button type="danger" text="名字" size="mini"></Button>
    <Button type="warning" text="名字" size="small"></Button>
    <Button type="success" text="名字" size="mini"></Button>
    <Button type="danger" text="名字" size="medium"></Button>
    <Button type="success" text="名字" size="mini"></Button>
    <Button type="warning" text="名字" size="medium"></Button>

到此這篇關(guān)于vue中的render函數(shù)、h()函數(shù)、函數(shù)式組件的文章就介紹到這了,更多相關(guān)vue render函數(shù) h()函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue3?Transition組件給頁(yè)面切換并加上動(dòng)畫效果

    Vue3?Transition組件給頁(yè)面切換并加上動(dòng)畫效果

    這篇文章主要給大家介紹了關(guān)于Vue3?Transition組件給頁(yè)面切換并加上動(dòng)畫效果的相關(guān)資料,vue的過渡動(dòng)畫主要是transition標(biāo)簽的使用,配合css動(dòng)畫實(shí)現(xiàn)的,需要的朋友可以參考下
    2023-06-06
  • sortable+element 實(shí)現(xiàn)表格行拖拽的方法示例

    sortable+element 實(shí)現(xiàn)表格行拖拽的方法示例

    這篇文章主要介紹了sortable+element 實(shí)現(xiàn)表格行拖拽的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2019-06-06
  • Vue+Ant Design進(jìn)行大數(shù)據(jù)量下拉框卡頓與表單提交優(yōu)化

    Vue+Ant Design進(jìn)行大數(shù)據(jù)量下拉框卡頓與表單提交優(yōu)化

    在現(xiàn)代前端開發(fā)中,處理大數(shù)據(jù)量渲染和表單交互是常見的挑戰(zhàn),本文將探討如何優(yōu)化 Ant Design Vue 下拉框在大數(shù)據(jù)量情況下的性能問題,并解決表單提交后重復(fù)提示的問題,需要的可以了解下
    2025-03-03
  • Vue中使用v-print打印出現(xiàn)空白頁(yè)問題及解決

    Vue中使用v-print打印出現(xiàn)空白頁(yè)問題及解決

    這篇文章主要介紹了Vue中使用v-print打印出現(xiàn)空白頁(yè)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • vue cli3中eslint報(bào)錯(cuò)no-undef和eslint規(guī)則配置方式

    vue cli3中eslint報(bào)錯(cuò)no-undef和eslint規(guī)則配置方式

    這篇文章主要介紹了vue cli3中eslint報(bào)錯(cuò)no-undef和eslint規(guī)則配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • vue組件實(shí)現(xiàn)文字居中對(duì)齊的方法

    vue組件實(shí)現(xiàn)文字居中對(duì)齊的方法

    這篇文章主要為大家詳細(xì)介紹了vue組件實(shí)現(xiàn)文字居中對(duì)齊的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 解析使用useDark(),發(fā)現(xiàn)transition?動(dòng)畫失效

    解析使用useDark(),發(fā)現(xiàn)transition?動(dòng)畫失效

    這篇文章主要為大家介紹了使用useDark(),發(fā)現(xiàn)transition動(dòng)畫失效的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Vue瀑布流插件的使用示例

    Vue瀑布流插件的使用示例

    這篇文章主要介紹了Vue瀑布流插件的使用示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2018-09-09
  • 解決vue中菜單再次點(diǎn)擊內(nèi)容不刷新問題

    解決vue中菜單再次點(diǎn)擊內(nèi)容不刷新問題

    當(dāng)elementUI中菜單打開后,再次點(diǎn)擊不會(huì)刷新的問題,導(dǎo)致菜單再次點(diǎn)擊不刷新的根本原因是頁(yè)面打開后,再次打開相同的頁(yè)面是不會(huì)刷新的,這應(yīng)該是框架的機(jī)制就是如此,小編整理了兩個(gè)比較不錯(cuò)的解決方法,需要的朋友可以參考下
    2023-08-08
  • Vue發(fā)布訂閱模式實(shí)現(xiàn)過程圖解

    Vue發(fā)布訂閱模式實(shí)現(xiàn)過程圖解

    這篇文章主要介紹了Vue發(fā)布訂閱模式實(shí)現(xiàn)過程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論

兴仁县| 会宁县| 湟源县| 寿宁县| 仙游县| 景谷| 临高县| 南丰县| 班玛县| 樟树市| 都兰县| 静海县| 泰来县| 瑞金市| 静乐县| 尉氏县| 安陆市| 东莞市| 衡南县| 绥江县| 台前县| 镇平县| 奈曼旗| 大厂| 阿拉善左旗| 贡觉县| 安乡县| 祥云县| 栾川县| 福建省| 万荣县| 安陆市| 同心县| 静海县| 隆尧县| 曲沃县| 北碚区| 新竹市| 荆门市| 南阳市| 寿光市|