±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁËPreactÊÇʲô£¿PreactµÄºËÐÄ£¬Preact°´ÐèʹÓá£
±¾ÎÄÀ´×ÔÓÚ°¢ÀïÔÆ¿ª·¢ÕßÉçÇø,ÓÉ»ðÁú¹ûÈí¼þAnna±à¼ÍƼö¡£ |
|
1¡¢Ç°ÑÔ
ReactÏÖÈç½ñÒѾ³ÉΪǰ¶Ë¿ª·¢ÕßµÄÊ×Ñ¡¼¼ÊõÁË£¬ËüÌìÉúЯ´ø×Å×é¼þ»¯µÄÀíÄ²¢ÇÒÓµÓм«Ç¿µÄÉú̬£¬ÈçRedux,FluxµÈÊý¾Ý¹ÜÀí¹¤¾ß£¬Material-UI,MUI,Ant.DesignµÈUI×é¼þ£¬¶ÔÓÚÒ»¸öȫеĿØÖÆÌ¨ÏµÍ³£¬ÔÚ½ÅÊּܵĸ¨ÖúÏ£¬ÎÒÃÇ¿ÉÒÔ»¨·ÑºÜÉÙµÄʱ¼ä¾ÍÄÜͶÈëµ½ÒµÎñ¿ª·¢ÖС£
¶ÔÓÚÎÞÏß¶Ë£¬ReactÒ²Äܹ»ºÜºÃµÄÖ§³Ö£¬µ«ÊǶÔÓÚһЩÔËÓª»î¶¯Ò³ÃæÀ´Ëµ£¬´ó²¿·ÖÇé¿öÏÂʹÓÃkimiÊÇ¿ÉÒÔÓ¦¸¶µÄ£¬ÕâЩ»î¶¯Ò³¾ßÓÐÈçÏÂÌØµã£º
ʱЧÐÔÇ¿£¬ºÜ¶àÔËÓªÐèÇóÀ´µÄÌØ±ð¼±£¬ÍùÍùÊǼ´¿ª·¢¼´½»¸¶µÄ¡£
·ç¸ñ±ðÖ£¬»ù±¾ÉϻҳUIÎÞ·¨Í¨Ó㬵«ÊÇÓÐÒ»Ð©ÌØÀý£¬È磺Loading£¬Dialog£¬Toast£¬Tab¡£
Âß¼¼òµ¥£¬»ù±¾ÎªÄÚÈÝչʾ£¬²»ÓÃд̫¶à£¬ÉõÖÁ²»ÐèҪдJavaScript¡£
µ«ÊǶÔÓÚÒÔÏÂÌØµãµÄ»î¶¯Ò³£¬Ê¹ÓÃkimi¾ÍÓÐЩÁ¦²»´ÓÐÄÁË¡£
ÄÚ¾ÛÐÔÇ¿£¬´ËÀà»î¶¯Óɶà¸öÒ³Ãæ¹²Í¬×é³É£¬¶à¸öÒ³ÃæÍ¨¹ýÌø×ªÐγɱջ·¡£
¶¯Ì¬ÄÚÈݶ࣬ÐèÒªµ÷Óöà¸ö½Ó¿Ú½øÐÐÒ³ÃæµÄ³ÊÏÖ¡£
Ò³ÃæÕ¹Ïַḻ£¬Ò³ÃæÉÏÓÐÐí¶àÐж¯µã£¬Ã¿¸öÐж¯µã¶ÔÓ¦Ò»¶ÎÒµÎñÂß¼£¬¶àÒ³Ãæ¼äÏ໥¹ØÁª¡£
ÐèÇó±ä»¯Æµ·±£¬´ËÀà»î¶¯ÍùÍù±¸ÊܹØ×¢£¬ÐèÇóÔÚǰÆÚ²»¿ÉÄÜÍêÈ«Ã÷È·½çÏÞ£¬ÉÏÏߺóÒ²»á¸ù¾ÝÍâ½ç·´À¡ËæÊ±¸ü¸ÄÐèÇó¡£
¶ÔÓÚÉÏÊö»î¶¯Ò³¶øÑÔ£¬ÆäÒѾ¿ÉÒÔ¿´×÷Ò»¸öÍêÕûµÄÖÐÐÍApplicationÁË£¬Èç¹û½ö½öʹÓÃkimi£¬ÔòÒòΪ״̬¶à£¬½»»¥¶à¶ø´æÔÚ´úÂëÖÊÁ¿²»ºÃ°Ñ¿Ø£¬ÔÚ²Ù×÷DOMÉÏ»¨·Ñ¶îÍ⾫Á¦£¬Ôì³ÉÏîÄ¿DelayµÄ·çÏÕ£¬Óɴ˿ɼû£¬¶ÔÓÚÕâÀà»î¶¯Ò³£¬ÎÒÃÇÓбØÒªÊ¹ÓÃһЩ¿âÀ´°ïÎÒÃǽâ¾öÎÊÌâÁË£¬React×Ô¼ºÌìȻһÌ×È«¼ÒͰ£¬Ð¯´øÁËPropType,Children,Synthetic
Events£¨ºÏ³Éʼþ£©£¬ÕâЩ¶ÔÓÚWebÓ¦ÓÃÀ´Ëµ£¬ÒÀÈ»ÊÇ¿ÉÒԵ쬵«ÊǶÔÓڻҳÀ´Ëµ£¬»¹ÊÇÓÐÐ©ÖØÁË£¬ÓÚÊÇÒª°á³öPreactÁË£¬½ÓÏÂÀ´¼òµ¥µØ¶ÔËüÓÐÒ»¸öÁ˽⡣
PreactÊÇÒÔReactΪ±ê׼ʵÏÖµÄÒ»Ì׿⡣
Á½ÕßµÄAPI¼¸ºõÒ»Ö£¬Ç¨ÒÆÆðÀ´ºÜ·½±ã¡£
ÏÖÓÐÏîÄ¿¸ÄÔìÒ²ºÜÈÝÒ×£¬ÎÞ·ÇÊǸĸÄWebpack,BabelµÄÅäÖÃÎļþ¡£
ËüºÜС£¨Ñ¹Ëõºó3KB£©,Сµ½¿ÉÒÔÈÏΪËüÖ»ÊÇ½è¼øÁËReactµÄ˼Ï룬À´±ÜÃâÄãÊÖ¶¯²Ù×÷DOM¡£
ËüºÜ¿ì£¬±ÈReact,Vue¶¼¿ì£¬·Ç³£ÊʺÏÒÆ¶¯¶Ë¡£²Î¿¼
2¡¢Hello World
ÏÂÃæÊÇËüµÄÒ»¸ö¼òµ¥Ê¾Àý£¬Äã»á·¢ÏÖ¼¸ºõºÍReactһģһÑù£¬Ö»ÊÇÒýÈëµÄÎļþ·¢ÉúÁ˸ı䣬Ҳ¾ÍÊÇ˵¶ÔÓÚÏÖÓеÄÒ»¸öÒ³Ãæ£¬ÎÒÃÇ¿ÉÒÔÓÃPreactÖØ¹¹µôÔÏȵÄDOM²Ù×÷¡£
import {h,render}
from 'preact';
render((
<div>
<h1>Hello World</h1>
<button onClick={function(){console.log('hi')}}>
Click Me </button>
</div>
),document.body); |
3¡¢ºËÐÄÁ˽â
3.1 ´¦ÀíJSX
ÔÚ¿ª·¢Reactʱ£¬ÎÒÃǶ¼»áȥдJSX¶ø²»È¥Ð´ÔÉúµÄReact API£¬»Ø¹Ëһϣ¬ÎÒÃÇ¿´Ò»ÏÂJSX»á±»Babel·Òë³Éʲô¡£
// ÕâÊÇÒ»¶ÎReactʾÀý´úÂë
class Demo extends React.Component {
render(){return ( <div className="active">
<ul></ul> </div>
)}
}
//¾¹ýBabelתÒëºó
_createClass(Demo, [{
key: "render",
value: function render() {
return React.createElement( "div",
{ className: "active" },
React.createElement( "ul",
null
)
);
}
}]);
|
ÎÒÃÇ¿´µ½´¦ÀíDOMµÄAPIΪReact.createElement£¬ÔÚPreactÀËüʹÓÃÁËhyperscriptÀ´´úÌæReact.createElementÕâ¸ö·½·¨£¬ËùÒÔÄãÐèÒª¸æËßBabelʹÓÃhÈ¥´¦Àí¡£
/{ "plugins":
[
["transform-react-jsx", { "pragma":"h"
}]
]
} |
ÉõÖÁÄãÒ²¿ÉÒÔÕâô×ö¡£
import { h }
from 'preact'
const React = {
createElement:h
} |
3.2 ʼþ
PreactÖ»ÊǼòµ¥µØ¶Ôʼþ×öÁËÒ»²ã´¦Àí£¬ÎÒÃÇ¿´ËüµÄÔ´Âë±ã¿ÉÖªÏþ£¬ÎÒÃÇÔÚJSXÀïдµÄonClickÆäʵ×îÖÕÐγÉÁËaddEventListener('click')£¬ÓÉÓÚÆäÖ»ÊÇÔÉúµÄʼþ°ó¶¨£¬ÕâÑù¸øÓèÎÒÃǵÄÁé»î¶È¸ü¸ß£¬Òƶ¯¶ËÍ·ÌÛµÄ300msÑÓʱºÍµã»÷´©Í¸ÎÊÌâÒ²¿ÉÒÔÓÈжø½â£¨fastclick£©¡£
else if ('o'
=== name[0] && 'n' === name[1]) {
var l = node._listeners || (node._listeners =
{});
name = toLowerCase(name.substring(2));
if (value) {
if (!l[name]) node.addEventListener(name, eventProxy);
} else if (l[name]) node.removeEventListener(name,
eventProxy);
l[name] = value;
}
|
4¡¢°´ÐèʹÓÃ
4.1 ¿´×öеÄÄ£°åäÖȾ·½Ê½
ÔÚǰ¶ËÓÐÐí¶àÖÐÄ£°åäÖȾ·½°¸£¬Èçjade(pug),mustache,ejs£¬ÎÒÃÇÒ²¿ÉÒÔʹÓÃJSXÓÃÀ´äÖȾ£¬Ïà±ÈÇ°Ãæ¼¸ÖÖ£¬JSXд·¨¼òµ¥£¬·Ç³£ÈÝÒס£¾Ù¸öÀý×Ó£ºÈç¹ûÎÒÃÇÒª¸ù¾Ýºó¶Ë·µ»ØµÄÒ»¶Î½±Æ·ÁбíäÖȾһ¸öÁÐ±í£¬ÓÃejs¿ÉÄÜ»áÊÇÏÂÃæÕâÑù£º
<ul>
<% lotteries.forEach(function(lottery){ %>
<% include lottery/show %> <% })
%>
</ul> |
µ«ÊÇʹÓÃPreact£¬ÎÒÃÇ¿ÉÒÔֻʹÓÃrender·½·¨£¬½áºÏJSXÓï·¨£¬À´×÷ΪÎÒÃÇäÖȾHTMLµÄ¹¤¾ß¡£
let content =
lotteries.map(lottery=>( <li>{lottery.prizeName}</li>
))
let List = ( <ul>
{content} </ul>
)
let html = render(<List/>); // DOM Object
let htmlString = html.outerHTML // String
// do anything? |
|