Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4ed81f1

Browse files
committed
- Version: 1.1.11 Build 20240122
- 加入Model双向绑定结构。
1 parent 8f890ab commit 4ed81f1

File tree

3 files changed

+95
-2
lines changed

3 files changed

+95
-2
lines changed

README.react.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
2+
13
# DOMHtml for React
24

35
## React的插件,使用对象替代JSX来管理React元素。
@@ -165,6 +167,59 @@
165167
//<div id="div" className="div1 div3">This is a DIV.</div>
166168
```
167169
170+
#### 双向绑定
171+
172+
- 使用model传递state和onChange的handle函数,从而更加方便地实现双向绑定。
173+
174+
- model为数组时,model[0]为value,model[model.length-1]为handle函数,model[1]~model[model.length-1]为扩展数据(如radio的默认选中值)。
175+
176+
- model为对象时,将在dom_attr中解构,因此其内部字段与dom_attr保持一致。
177+
178+
- 在model中,checkbox的checked属性将被自动映射为model[0]:boolean。
179+
180+
- 组件使用model时,需要接收value、onChange两个props。
181+
182+
- ```javascript
183+
function ModelRoot(){
184+
const radioList=[
185+
`test1`,`test2`,`test3`,
186+
];
187+
const [input, setInput]=useState(``);
188+
const [text, setText]=useState(``);
189+
const [check, setCheck]=useState(false);
190+
const [radio, setRadio]=useState(radioList[1]);
191+
192+
function inputChange(e){
193+
setInput(e.target.value);
194+
}
195+
function textChange(e){
196+
setText(e.target.value);
197+
}
198+
function checkChange(e){
199+
setCheck(e.target.checked);
200+
}
201+
function changeRadio(e){
202+
setRadio(e.target.value);
203+
}
204+
return rDOM([
205+
{tag:`input`, model:[input, inputChange]},
206+
{tag:`textarea`, model:[text, textChange]},
207+
{tag:`input`, type:`checkbox`, model:[check, checkChange]},
208+
{tag:`input`, type:`checkbox`, checked:check, onChange:checkChange},
209+
// 以上两个checkbox项的意义完全一致。
210+
...radioList.map((r,i)=>({tag:`input`, type:`radio`, model:[r, r==radio, changeRadio], title:r})),
211+
...radioList.map((r,i)=>({tag:`input`, type:`radio`, model:{value:r, checked:r==radio, onChange:changeRadio}, title:r})),
212+
...radioList.map((r,i)=>({tag:`input`, type:`radio`, model:[r, changeRadio], checked:r==radio, title:r})),
213+
...radioList.map((r,i)=>({tag:`input`, type:`radio`, value:r, onChange:changeRadio, checked:r==radio, title:r})),
214+
// 以上四个radio项的意义完全一致。
215+
{tag:ModelComponent, model:[input, inputChange]},
216+
]);
217+
}
218+
function ModelComponent({value, onChange}){
219+
// 组件相关代码
220+
}
221+
```
222+
168223
#### CSS样式
169224

170225
- 使用JSX标准的CSS格式。

VERSION.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# JQuery DOM
22

3+
- Version: 1.1.11 Build 20240122
4+
- 加入Model双向绑定结构。
5+
36
- Version: 1.1.10 Build 20240119
47
- 修复表格重复输出的bug。
58
- 修复Invalid prop `attr`警告。

react.extensions.dom.js

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,50 @@ function reactDOMHtml(dom_tag,dom_attr,dom_html,dom_html_after){
4646
return dom_attr; // 已被React.createElement封装的情况下,直接返回此对象
4747
}
4848

49+
//Model双向绑定
50+
if(typeof dom_attr.model==`object`){
51+
let modelObject={};
52+
if(dom_attr.model.length!=undefined && dom_attr.model.length>=2 && typeof dom_attr.model[dom_attr.model.length-1]==`function`){
53+
// model:[value, extend, onChange]
54+
modelObject.value=dom_attr.model[0];
55+
modelObject.extend=dom_attr.model.slice(1,dom_attr.model.length-1);
56+
modelObject.onChange=dom_attr.model[dom_attr.model.length-1];
57+
}else{
58+
modelObject=dom_attr.model;
59+
}
60+
61+
if(dom_tag==`input` && dom_attr.type!=undefined){
62+
switch(dom_attr.type){
63+
case `checkbox`:
64+
dom_attr.checked=modelObject.value;
65+
delete modelObject.value;
66+
break;
67+
case `radio`:
68+
dom_attr.value=modelObject.value;
69+
if(typeof modelObject.extend==`object` && modelObject.extend.length>0){
70+
dom_attr.checked=modelObject.extend[0];
71+
delete modelObject.extend;
72+
}else if(modelObject.checked!=undefined){
73+
dom_attr.checked=modelObject.checked;
74+
delete modelObject.checked;
75+
}
76+
break;
77+
}
78+
}
79+
dom_attr={...dom_attr, ...modelObject};
80+
}
81+
4982
dom_html=dom_attr.html || dom_html;
5083
dom_html_after=dom_attr.htmlAfter || dom_html_after;
5184

5285
//对attr进行过滤和改名
5386
let dom_attr_fix_blacklist=[
54-
`tag`,`html`,`htmlAfter`,
87+
`tag`,`html`,`htmlAfter`,`model`,
5588
]
5689
let dom_attr_fix_replace={
57-
tagName:`tag`, attrName:`attr`, tag_name:`tagName`,attr_name:`attrName`, class:`className`, for:`htmlFor`,
90+
tagName:`tag`, attrName:`attr`, modelName:`model`,
91+
tag_name:`tagName`,attr_name:`attrName`, model_name:`modelName`,
92+
class:`className`, for:`htmlFor`,
5893
}
5994
let dom_attr_fix={};
6095
for(let key in dom_attr){

0 commit comments

Comments
 (0)