React的className属性和style属性是React的扩展吗?

首先

当在HTML中指定类名或内联样式时,可以按照以下方式进行编写。

<div class="your-name" style="color: #FF0000;">
  Hello World!
</div>

在 React (JSX) 中,可以这样表达。

<div className="your-name" style={{ 'color': '#FF0000' }}>
  Hello World!
</div>

在公式文件中,也提到了在 React 和 HTML 中有几个属性的行为是不同的。

 

从上面可以看出,React的className属性和style属性与HTML不同,因此可以说它们是React的扩展。

除了onChange属性外,还有许多与HTML行为不同的属性,如select/textarea标签的value/defaultValue属性。

JSX是React的功能,那么是否应该称其为JSX扩展而不是React呢?这可能是正确的。

不是React,而是DOM的扩展?

然而,据说在 React 中不仅仅是字符串,还可以用className这样的名称或内联样式进行指定,这是 JavaScript 本身就具备的特性。

document.querySelectorAll('div')[0].style.color = '#00FF00';
document.querySelectorAll('div')[0].className = 'another-class-name';

这意味着它们不是 React 的扩展吗?为了进行调查,让我们看一下 JSX 的转译结果。(需要注意的是,这个例子使用的是 React 17.0.2,而没有使用 React 17 的新功能_jsx和_jsxs。根据环境的不同,可能会出现这样的转换结果。)

l.createElement(
  "div",
  {
    className: "your-class-name",
    style: {color:"#FF0000"}
  },
  "Hello World!"
),

l.createElement 可能是指 React.createElement。然而,此 createElement 方法与 JavaScript 的 DOM 中原有的同名方法不同,因此从这个意义上说,它可以被称为是 React 的功能(或 JSX 的功能)。

总结

在React中,存在一些与HTML的行为不同的属性,如className属性和style属性。此外,JavaScript的createElement方法并没有指定这些属性的功能。因此,可以说这些属性是React(JSX)的扩展。(这是个人观点)

给你个小礼物。

最后,我们将附上HTML和各种框架的比较。从这个角度来看,可以发现DOM和React的设计非常相似。

指定课程名称和内联样式

HTML – HyperText Markup Language 是一种用于创建网页的标记语言。

<div class="your-name" style="color: #FF0000;">
  Hello World!
</div>

DOM(文档对象模型)

element.className 是一个字符串,所以它的格式与 React 相同。
然而,不能直接将对象赋值给 element.style 并应用样式。

const element = document.querySelectorAll('div')[0];

element.style.color = '#00FF00';
element.className = 'another-class-name';

React / JSX 反应/ JSX

似乎Vue+JSX的写法几乎相同。

<div className="your-class-name" style={{ 'color': '#FF0000' }}>
  Hello World!
</div>

Vue.js – 只需要一个选项的原生中文释义:Vue.js

在Vue中,您可以使用v-bind:来编写JavaScript代码,也可以使用与常规HTML相同的写法。

<div class="your-name" style="color: #FF0000">
  Hello World!
</div>
または
<div v-bind:class="dynamicClass"
     v-bind:style="{ color: dynamicColor }">
  Dynamic Attributes!
</div>

表单元素

HTML (超文本标记语言) 可以用来创建和组织网页内容。

<select>
  <option value="apple">りんご</option>
  <option value="orange" selected>みかん</option>
</select>
<textarea>Hello World</textarea>
<input type="checkbox" checked />チェックボックス

DOM – 文档对象模型

const selectElement = document.querySelectorAll('select')[0];
const textareaElement = document.querySelectorAll('textarea')[0];
const checkboxElement = document.querySelectorAll('input[type="checkbox"]')[0];

selectElement.value = "apple";
textareaElement.value = "Enjoy JavaScript!";
checkboxElement.checked = false;

React / JSX 反应/简单 JavaScript XML

<select value={myFruit}>
  <option value="apple">りんご</option>
  <option value="orange">みかん</option>
</select>
<textarea value={myText} />
<input type="checkbox" checked={isChecked} />チェックボックス

Vue

<select v-bind:value="myFruit">
  <option value="apple">りんご</option>
  <option value="orange">みかん</option>
</select>
<textarea v-bind:value="myText" />
<input type="checkbox" v-bind:checked="isChecked" />チェックボックス

另外,您也可以使用v-model来实现双向数据绑定,而不是使用v-bind。

事件处理程序

将以下内容用中文表述,只需要一个选项:

HTML

<form action="./submit"
      onSubmit="console.log('submit'); return false;">
  <input type="text"
         onChange="console.log('change')"
         onInput="console.log('input')" />
  <button type="submit">送信</button>
</form>

DOM (Document Object Model) 是一种程序接口,提供了对 HTML 和 XML 文档的结构化表达和操作方法。

如果使用addEventListener,则不能使用return false来取消处理。

const formElement = document.querySelectorAll('form')[0];
const inputElement = document.querySelectorAll('input[type="text"]')[0];

inputElement.addEventListener("change", () => { console.log('change'); }); 
inputElement.addEventListener("input", () => { console.log('input'); }); 
formElement.addEventListener("submit", (e) => {
  console.log('submit');
  e.preventDefault();
}); 

React / JSX 反应 / JSX

返回 false; 不能停止表单提交的特点与 DOM 规范类似。但是,作为参数传递的不是在 DOM 中实现的 Event,而是被称为合成事件的东西。即使如此,您仍然可以使用 e.preventDefault() 或 e.stopPropagation() 等方法。

另外,在文本框中的onChange行为与JavaScript的onInput类似,每输入一个字符就会调用事件处理程序。

<form action="./submit"
      onSubmit={(e) => { console.log('submit'); e.preventDefault(); }}>
  <input type="text"
         onChange={() => { console.log('change'); }} />
  <button type="submit">送信</button>
</form>

Vue

可以使用.prevent()函数来模拟e.preventDefault()。

<form action="./submit"
      v-on:submit.prevent="log += 'submit!'">
  <input type="text"
         v-on:change="log += 'change!'"
         v-on:input="log += 'input!'" />
  <button type="submit">送信</button>
  <p>{{ log }}</p>
</form>
广告
将在 10 秒后关闭
bannerAds