• vue


    父组件

    <template>
       <div>
          <vueRender msg="Render Test" :level="3" :items="items">
    	 <div class="header">default header</div>
    	 <p slot="header">slot header</p>
          </vueRender>   
       </div>
    </template>
    
    <script>
    import vueRender from './vue-render.vue'
    export default {
        name: 'app',
        components: { vueRender },
        data() {
          return {
    	items: [{
    	  name: 'hello'
    	},
    	{
    	  name: 'vue'
            },
    	{
    	  name: 'js'
    	}]
         }
       }
    }
    </script>
    
    <style>
    </style>
    

    子组件

    <template>
    	<div class="render">
    		<h1>{{ msg }}</h1>
    		<renderComponent></renderComponent>
    		<renderComponentList></renderComponentList>
    	</div>
    </template>
    
    <script>
    	export default {
    		name: 'RenderTest',
    		props: {
    			msg: String,
    			level: {
    				type: Number,
    				required: true
    			},
    			items: {
    				type: Array,
    				required: false
    			}
    		},
    		components: {
    			renderComponent: {
    				/**
    				 * render: 渲染函数
    				 * 参数: createElement
    				 * 参数类型: Function
    				 */
    				render: function(createElement) {
    					let _this = this['$options'].parent // 我这个是在 .vue 文件的 components 中写的,这样写才能访问this
    					let _header = _this.$slots.header // // $slots: vue中所有分发插槽,不具名的都在default里
    					/**
    					 * createElement 本身也是一个函数,它有三个参数
    					 * 
    					 * 返回值: VNode
    					 * 
    					 * 1. 一个 HTML 标签字符串,组件选项对象,或者解析上述任何一种的一个 async 异步函数。必需参数。{String | Object | Function} - 就是你要渲染的最外层标签
    					 * 
    					 * 2. 一个包含模板相关属性的数据对象你可以在 template 中使用这些特性。可选参数。{Object} - 1中的标签的属性
    					 * 
    					 * 3. 子虚拟节点 (VNodes),由 `createElement()` 构建而成,也可以使用字符串来生成“文本虚拟节点”。可选参数。{String | Array} - 1的子节点,可以用 createElement() 创建,文本节点直接写就可以
    					 */
    					return createElement(
    						'h' + _this.level, // 标签名称 - 第一个参数
    						{
    							style: {
    								color: 'gray',
    								border: '1px solid pink'
    							},
    							class: { // 样式类名 例如 cassname就是样式类名
    								cassname: true
    							},
    							// 正常的 HTML 特性
    							attrs: {
    								id: 'foo'
    							},
    							// 组件 props
    							props: {
    								myProp: 'bar'
    							},
    							// DOM 属性
    							domProps: {
    								innerHTML: 'baz',
    								value: '' // input select 
    							},
    							//  事件监听器基于 `on`
    							on: { // 绑定事件
    								click: () => {
    									console.log('点击事件')
    								},
    								input: (event) => { // 用于input
    									self.$emit('input', event.target.value)
    								}
    							},
    							// 仅对于组件,用于监听原生事件,而不是组件内部使用
    							// `vm.$emit` 触发的事件。
    							nativeOn: {
    								click: this.nativeClickHandler
    							},
    							// 自定义指令。注意,你无法对 `binding` 中的 `oldValue`
    							// 赋值,因为 Vue 已经自动为你进行了同步。
    							directives: [
    								{
    									name: 'my-custom-directive',
    									value: '2',
    									expression: '1 + 1',
    									arg: 'foo',
    									modifiers: {
    										bar: true
    									}
    								}
    							],
    							// Scoped slots in the form of
    							// { name: props => VNode | Array<VNode> }
    							scopedSlots: {
    								default: props => createElement('span', props.text)
    							},
    							// 如果组件是其他组件的子组件,需为插槽指定名称
    							slot: 'name-of-slot',
    							// 其他特殊顶层属性
    							key: 'myKey',
    							ref: 'myRef'
    						}, // 第二个单数
    						[
    							'text', // 文本节点直接写就可以
    							_this.$slots.default, // 默认插槽
    							createElement('div', _header)   // 具名插槽  createElement()创建的VNodes
    						] // 子元素数组 - 第三个参数 也可以直接  文本'text'
    					)
    				}
    			},
    			renderComponentList: {
    				render: function(createElement) {
    					let _this = this['$options'].parent
    					if (_this.items.length) {
    						return createElement(
    							'ul',
    							_this.items.map(function(item) {
    								return createElement('li', item.name)
    							})
    						)
    					} else {
    						return createElement('p', 'No items found.')
    					}
    				}
    			}
    		}
    	}
    </script>
    
    
  • 相关阅读:
    fatfs输出目录
    《基于多光程长的高散射物质光学参数的测量及其应用》论文
    《2013李永乐线性代数强化班》视频1,2,3,4
    oled屏幕模块
    python中数据结构
    大数据python词频统计之hdfs分发-cacheFile
    8大排序之Python实现 冒泡排序优化
    大数据python词频统计之本地分发-file
    2019-04-30vmware虚拟机安装macos 10.8格式为iso
    2019-04-24Scurecrt 如何下载文本文件
  • 原文地址:https://www.cnblogs.com/mary-123/p/13580101.html
Copyright © 2020-2023  润新知