2023年了,该清楚命令式与声明式编程了
命令式
编程的例子
<html>
<body>
<div id="app"></div>
<script type="text/javascript">
const app = document.getElementById('app');
const header = document.createElement('h1');
const headerContent = document.createTextNode('Develop. Preview. Ship. 🚀');
header.appendChild(headerContent);
app.appendChild(header);
</script>
</body>
</html>
随着程序或者团队变大,这种编码方式会导致构建程序变得困难 通过命令式的方式,开发人员需要用大量时间来编写指令来告诉计算机如何做事 那么,通过描述你想展示什么内容,让计算机弄清楚如何更新DOM不是(妙妙妈给妙妙开门 妙到家了?) 为了解决以上痛点,像我们平时开发用的vue react等就属于声明式的框架,作为开发人员,您可以告诉react, 您希望用户界面改变成什么样,react就替代您,来找到如何更新DOM的步骤。
声明式
编程的例子
<html>
<body>
<div id="app"></div>
<script src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<script type="text/javascript">
const app = document.getElementById('app');
ReactDOM.render(<h1>Develop. Preview. Ship. 🚀</h1>, app);
</script>
</body>
</html>
我们通过来自react-dom的ReactDOM.render()方法,来告知react来渲染我们的h1标题到我们的app元素节点上
替代了之前通过纯js来直接操作DOM的方式
但是直接浏览器运行这段代码,会报错的,因为<h1>...</h1>
这段代码就是JSX
那同学又问了,啥是JSX,JSX就是一个针对于js的语法扩展,它允许你通过一种类似于HTML格式的语法,来描述你的UI,你只需要记住JSX的3大规则即可,你不用再学习新的标签或者语法
那同学又又会问了,啥是JSX的3大规则:
1.返回单个根元素
<div>
<h1>hi Q</h1>
<img
src="https://demo.jpg"
alt="hi Q"
class="photo"
>
<ul>
...
</ul>
</div>
<>
<h1>hi L</h1>
<img
src="https://demo.jpg"
alt="hi L"
class="photo"
>
<ul>
...
</ul>
</>
以上两种形式都是可以的,只不过空标签,它不会在浏览器html tree中留下踪迹 那可能同学又又又要问了,为啥这些JSX标签需要被包裹起来,JSX看起来像html,但是底层它是被转换为js对象的,包装到数组中,你不能从一个函数里返回两个对象,这也解释了为什么你不能返回两个jsx标签
2.要求标签显示闭合
自关闭标签<img>
必须成为<img />
,包装标签<li>oranges
必须写成<li>oranges</li>
3.大部分属性要是驼峰
因为jsx变成js,用jsx写的属性变成js对象的键,js对变量名有显示,不能用破折号,不能用保留字,如class
正确示例:
<img
src="https://demo.jpg"
alt="Hi Q"
className="photo"
/>
也不用担心写错了,写错了react会在控制台给你报错的 可能小伙伴:你干嘛 哎哟(doge),这么多属性,让我一个个手动转换岂不是累趴, 转换工具奉上: transform.tools/html-to-jsx
好了,我们书接上一回,刚才提到了直接浏览器运行jsx会报错,那我们就需要一个js的编译器,如Babel,把我们的jsx代码转换为常规的js(注意type 此时已换成text/jsx)
<html>
<body>
<div id="app"></div>
<script src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<!-- Babel Script -->
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/jsx">
const app = document.getElementById('app');
ReactDOM.render(<h1>Develop. Preview. Ship. 🚀</h1>, app);
</script>
</body>
</html>
至此呢,盆友们对于命令式与声明式的区别,应该有个大概,哪种可以提升开发效率呢,各位应该已经心中有数。
转载自:https://juejin.cn/post/7222294792893415461