|
| 1 | + |
| 2 | + |
1 | 3 | # DOMHtml for React
|
2 | 4 |
|
3 | 5 | ## React的插件,使用对象替代JSX来管理React元素。
|
|
165 | 167 | //<div id="div" className="div1 div3">This is a DIV.</div>
|
166 | 168 | ```
|
167 | 169 |
|
| 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 | + |
168 | 223 | #### CSS样式
|
169 | 224 |
|
170 | 225 | - 使用JSX标准的CSS格式。
|
|
0 commit comments