入门使用文档
从这里开始你可以一步步的了解,如何通过Rosetta提供的接口
定义element
定义一个element,需要定义三个部分
- HTML
- CSS
- JavaScript
Step one
这三个部分用标签<element></element>
包裹
- 此标签必须的属性为name,作为此element的custom element名称
- name 必须符合Web Components的要求包含'-'
定义一个名为'r-slider'的element的示例:
<element name="r-slider">
</element>
Step two
增加html、变量、属性
以<template></template>
包裹html的内容
<element name="r-slider">
<template>
</template>
</element>
- 为html增加DOM结构
<element name="r-slider">
<template>
<div>
我是DOM结构示例
</div>
</template>
</element>
html中使用数据
如果element有初始化属性为text,可通过
{text}
引用,同时可以通过实例的update()函数实现数据更新和UI渲染。attrs为内置变量,在js部分会详细说明如果element的register函数中定义了变量title,可以通过
{title}
直接访问。具体变量的定义和register函数在js部分会详细说明
- html中使用属性
<element name="r-slider">
<template>
<div>
我是DOM结构示例
</div>
<span>{text}</span>
</template>
</element>
- html中使用变量
<element name="r-slider">
<template>
<div>
我是DOM结构示例
</div>
<span>{text}</span>
<span>{title}</span>
</template>
<script type="text/javascript">
Rosetta({
is: 'r-slider',
properties: {
text: 'text'
},
title: '我是一个作用域内的变量'
});
</script>
</element>
Step three
设置样式
- 定义element时,可以为其定义样式,样式通过内联形式定义
- 支持
:host
选择器,选择对象是element实例的根节点,以实现内部样式隔离于element外部
<element name="r-slider">
<style>
:host div {
color: red;
}
</style>
<template>
<div>
我是DOM结构示例
</div>
</template>
</element>
Step four
注册element定义逻辑
- js部分用
<script></script>
包裹 - 通过Rosetta.register接口注册element
- Rosetta.register第一个参数为注册的element的名字,第二个参数为自定义渲染函数,在created之前执行
- 第一个参数element的名称需要和
<element></element>
上定义的name保持一致 - 第二个参数自定义渲染函数的arguments为element实例用'tag'表示
- 第二个参数自定义渲染函数和html引用的属性、变量共享作用域
<element name="r-slider">
<style>
:host div {
color: red;
}
</style>
<template>
<div>
我是DOM结构示例
</div>
<span>
{title}
</span>
</template>
<script type="text/javascript">
Rosetta({
is: 'r-slider',
title: '我是一个测试title'
});
</script>
</element>
绑定事件
Rosetta为element内部DOM提供事件绑定方式,以'on'加首字母大写的事件名为attribute名,以{xxx}
定义callback,如下示例:
<element name="r-slider">
<style>
:host div {
color: red;
}
</style>
<template>
<div>
我是DOM结构示例
</div>
<span>
{title}
</span>
<div onClick={clicked}>
</div>
</template>
<script type="text/javascript">
Rosetta({
is: 'r-slider',
clicked: function () {
alert('clicked');
}
});
</script>
</element>
生命周期
Rosetta为custom elements实现了和标准一致的生命周期:
- created:组件创建
- attached:组件渲染到document里
- detached:组件从document移除
- attributechanged:属性更新
element定义的时候可以绑定生命周期的事件
- onCreated
- onAttached
- onDetached
- onAttributeChanged
组件初始化的生命周期顺序
- created
- internal DOM initialized
- domReady
- attached
提供定义生命周期callback的两种形式
- 可以通过设置DOM的attribute的形式声明对于生命周期的绑定,类似于事件绑定,区别在于以attributes声明的时候生命周期只可以声明在
<element></element>
的属性上 - 在register的函数中定义
示例如下,分别用两种方式声明attached
和created
:
<element name="r-slider" onAttached={attached}>
<style>
:host div {
color: red;
}
</style>
<template>
<div>
我是DOM结构示例
</div>
<span>
{title}
</span>
<div onClick={clicked}>
</div>
</template>
<script type="text/javascript">
Rosetta({
is: 'r-slider',
attached: function () {
alert('attached');
},
created: function() {
alert('created');
},
clicked: function() {
alert('clicked');
}
});
</script>
</element>
声明依赖
Rosetta在使用custom element时,使用HTML Import声明依赖,如下示例:
<!DOCTYPE html>
<html>
<head>
<title></title>
<link rel="import" type="text/html" href="r-slider.html">
</head>
<body>
<r-slider></r-slider>
</body>
</html>
更新element的属性
- 在custom element使用的时候用attributes设置属性初始值
- 通过element实例的update函数接口更新属性值,Rosetta自动完成UI更新
- 内部html中通过
{xxx}
来引用对于xxx
属性的
定义element,绑定事件、实现属性更新逻辑
<element name="r-slider">
<style>
:host div {
color: red;
}
</style>
<template>
<div>
我是DOM结构示例
</div>
<span>
{title}
</span>
<div onClick={clicked}>
{text}
</div>
</template>
<script type="text/javascript">
Rosetta({
is: 'r-slider',
properties: {
text: {
type: String,
value: 'init'
}
},
clicked: function() {
this.update({
text: 'clicked!'
})
}
});
</script>
</element>
使用element,在使用处用HTML Import声明依赖
<!DOCTYPE html>
<html>
<head>
<title></title>
<link rel="import" type="text/html" href="r-slider.html">
</head>
<body>
<r-slider text="我是一个属性测试"></r-slider>
</body>
</html>
refs快速访问内部DOM
通过tag的refs属性快速访问DOM,作为对dom查询接口的补充,返回值为DOM对象
示例如下:
<element name="r-slider">
<style>
:host div {
color: red;
}
</style>
<template>
<div ref='test'>
我是ref的DOM选择示例
</div>
</template>
<script type="text/javascript">
Rosetta({
is: 'r-slider',
attached: function() {
var test = this.$['test'];
test.innerHTML += '更新啦';
}
})
</script>
</element>
定义容器
- 在custom element内部通过
<content></content>
定义容器 - 为
<content></content>
加上属性select设置对于element实例的子元素的过滤 - 比如一个
select
为'.aaa'的content,表示只有具有类名为'aaa'的子元素可以放入容器中,其他的子元素会被丢弃忽略
示例如下:
定义content
<element name="r-slider">
<style>
:host div {
color: red;
}
</style>
<template>
<content select='.aaa'>
</content>
</template>
<script type="text/javascript">
Rosetta({
is: 'r-slider'
})
</script>
</element>
使用element,传入子元素
<!DOCTYPE html>
<html>
<head>
<title></title>
<link rel="import" type="text/html" href="r-slider.html">
</head>
<body>
<r-slider text="我是一个属性测试">
<div class="aaa">
我会被选择加入容器
</div>
<div>
我会被忽略
</div>
</r-slider>
</body>
</html>
嵌套使用element
在定义elementA的时候使用已经定义好的elementB,是这里说的"嵌套使用element" 按照以下步骤嵌套使用element
- 通过HTML Import引入依赖的elementB定义文件
- 使用elementB的标签
示例如下:
<element name="r-a">
<style>
:host div {
color: red;
}
</style>
<link rel="import" type="text/html" href="r-b.html">
<template>
<content select='.aaa'>
</content>
<r-b></r-b>
</template>
<script type="text/javascript">
Rosetta({
is: 'r-a'
});
</script>
</element>
ready接口
- 在当前页面所有的custom element实例化完毕的时候会执行Rosetta ready状态的callback
- Rosetta.ready接口接受function为参数作为callback
- Rosetta.render()会主动触发element渲染,从而触发Rosetta.ready的callback的执行
<!DOCTYPE html>
<html>
<head>
<title></title>
<link rel="import" type="text/html" href="r-slider.html">
</head>
<body>
<r-slider text="我是一个属性测试">
<div class="aaa">
我会被选择加入容器
</div>
<div>
我会被忽略
</div>
</r-slider>
<script type="text/javascript">
Rosetta.ready(function() {
//you can access element instance and do something here
});
</script>
</body>
</html>
ref接口快速element实例
- 以声明的方式使用element的时候,可以添加ref这个attribute
- 通过Rosetta.ref('refName')快速获取element实例对象
<!DOCTYPE html>
<html>
<head>
<title></title>
<link rel="import" type="text/html" href="r-slider.html">
</head>
<body>
<r-slider text="我是一个属性测试" ref="lalala">
<div class="aaa">
我会被选择加入容器
</div>
<div>
我会被忽略
</div>
</r-slider>
<script type="text/javascript">
Rosetta.ready(function() {
//you can access element instance and do something here
var slider = Rosetta.ref('lalala');
});
</script>
</body>
</html>
init接口
Rosetta提供init接口,内部调用,进行页面自定义tag的解析
Rosetta.init()
基于FIS3的预处理
- Rosetta提供基于FIS3的解析插件进行element的定义html文件解析和编译
- Rosetta提供基于FIS3的打包插件,对于项目依赖的element进行按element对页面依赖关系进行插入,或者按页面级的allInOne打包后插入
- 构建配置在fis-conf.js中配置
示例配置如下:
fis
.match('*.{html,tpl}', {
parser: fis.plugin('rosetta', {
compileUsage: false
})
})
.match('/elements/r-*.html', {
rExt: '.js'
})
.match('/elements/*.*', {
release: '/static/$0'
})
.match('::packager', {
postpackager: fis.plugin('rosetta', {
allInOne: true
})
});
详细配置参考脚手架中的具体项目示例
发现了问题或想要贡献?来 Github 和Rosetta联系或者Fork吧!: /docs/lv1.md