ReAct 基本语法

一、ReactDOM.render()


ReactDOM.render 是 React 的最基本方法,用于将模板转为 HTML 语言,并插入指定的 DOM 节点。


ReactDOM.render(
  <h1>Hello, world!</h1>,
  document.getElementById('example')
);

上面代码将一个 h1 标题,插入 example 节点(查看 demo01),运行结果如下。



结构

在JSX文件中,可以直接通过React.createClass来定义组件:

var ButtonComponent = React.createClass({
    getDragonKillingSword: function(){
        //送宝刀
    },
    render: function(){
        return (<button onClick={this.getDragonKillingSword}>屠龙宝刀,点击就送</button>);
    }
});

父组件可以直接将需要执行的函数传递给子组件:

<ButtonComponent clickCallback={this.getSwordButtonClickCallback}/>

然后在子组件中调用父组件方法:

var ButtonComponent = React.createClass({
    render: function(){
        return (<button onClick={this.props.clickCallback}>屠龙宝刀,点击就送</button>);
    }
});

子组件通过this.props能够获取在父组件创建子组件时传入的任何参数,因此this.props也常被当做配置参数来使用


组件状态

在React中,每个组件都有自己的状态,可以在自身的方法中通过this.state取到,而初始状态则通过getInitialState()方法来定义,比如这个屠龙宝刀按钮组件,它的初始状态应该是没有点击过,所以getInitialState方法里面应当定义初始状态clicked: false。而在点击执行的方法中,应当修改这个状态值为click: true

var ButtonComponent = React.createClass({
    getInitialState: function(){
        //确定初始状态
        return {
            clicked: false
        };
    },
    getDragonKillingSword: function(){
        //送宝刀

        //修改点击状态
        this.setState({
            clicked: true
        });
    },
    render: function(){
        return (<button onClick={this.getDragonKillingSword}>屠龙宝刀,点击就送</button>);
    }
});

组件依赖

组件依赖的处理一般分为两个部分:组件加载和组件使用

组件加载

React没有提供相关的组件加载方法,依旧需要通过<script>标签引入,或者使用模块加载器加载组件的JSX和资源文件。

组件使用

如果细心,就会发现其实之前已经有使用的例子了,要想在一个组件中使用另外一个组件,比如在ParentComponent中使用ChildComponent,就只需要在ParentComponentrender()方法中写上<ChildComponent />就行了,必要的时候还可以传些参数。

疑问

到这里就会发现一个问题,React除了只处理了结构和逻辑,资源也不管,依赖也不管。是的,React将近两万行代码,连个模块加载器都没有提供,更与Angularjs,jQuery等不同的是,他还不带啥脚手架...没有Ajax库,没有Promise库,要啥啥没有...

虚拟DOM

那它为啥这么大?因为它实现了一个虚拟DOM(Virtual DOM)。虚拟DOM是干什么的?这就要从浏览器本身讲起

如我们所知,在浏览器渲染网页的过程中,加载到HTML文档后,会将文档解析并构建DOM树,然后将其与解析CSS生成的CSSOM树一起结合产生爱的结晶——RenderObject树,然后将RenderObject树渲染成页面(当然中间可能会有一些优化,比如RenderLayer树)。这些过程都存在与渲染引擎之中,渲染引擎在浏览器中是于JavaScript引擎(JavaScriptCore也好V8也好)分离开的,但为了方便JS操作DOM结构,渲染引擎会暴露一些接口供JavaScript调用。由于这两块相互分离,通信是需要付出代价的,因此JavaScript调用DOM提供的接口性能不咋地。各种性能优化的最佳实践也都在尽可能的减少DOM操作次数。

而虚拟DOM干了什么?它直接用JavaScript实现了DOM树(大致上)。组件的HTML结构并不会直接生成DOM,而是映射生成虚拟的JavaScript DOM结构,React又通过在这个虚拟DOM上实现了一个 diff 算法找出最小变更,再把这些变更写入实际的DOM中。这个虚拟DOM以JS结构的形式存在,计算性能会比较好,而且由于减少了实际DOM操作次数,性能会有较大提升

道理我都懂,可是为什么我们没有模块加载器?

所以就需要Webpack了

说说Webpack

什么是Webpack?

事实上它是一个打包工具,而不是像RequireJS或SeaJS这样的模块加载器,通过使用Webpack,能够像Node.js一样处理依赖关系,然后解析出模块之间的依赖,将代码打包


(1): Learning one 

(2):Learning two 



### React 基础语法与使用方法 React 是一个用于构建用户界面的 JavaScript 库,其核心思想是通过组件化的方式构建应用。以下是 React 的基础语法和使用方法: #### 1. React 的核心概念 React 的核心概念包括 **组件(Component)**、**JSX(JavaScript XML)**、**状态(State)** 和 **属性(Props)**。组件是 React 应用的基本构建单元,每个组件可以独立地管理自己的状态和逻辑。JSX 是一种语法扩展,允许在 JavaScript 中编写类似 HTML 的结构。状态用于存储组件内部的数据,而属性则用于在组件之间传递数据[^2]。 #### 2. JSX 语法 JSX 是 React 的重要特性之一,它允许开发者直接在 JavaScript 中编写类似 HTML 的代码。例如: ```jsx const element = <h1>Hello, React!</h1>; ``` JSX 的语法接近 HTML,但有一些关键区别,例如在 JSX 中使用 `className` 而不是 `class`,并且所有属性名都遵循驼峰命名规则[^1]。 #### 3. 组件的定义 React 组件可以通过函数或类来定义。函数组件是简单的 JavaScript 函数,返回 JSX 代码;类组件则是继承自 `React.Component` 的类,需要实现 `render()` 方法。 ```jsx // 函数组件 function Welcome(props) { return <h1>Hello, {props.name}</h1>; } // 类组件 class Welcome extends React.Component { render() { return <h1>Hello, {this.props.name}</h1>; } } ``` 函数组件更适合无状态的组件,而类组件则适合需要管理内部状态的复杂组件[^1]。 #### 4. 状态(State)与生命周期 状态是组件内部的数据,可以通过 `useState` 钩子(在函数组件中)或 `this.state`(在类组件中)进行管理。状态的变化会触发组件的重新渲染。 ```jsx // 函数组件中的状态管理 function Counter() { const [count, setCount] = React.useState(0); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}>Click me</button> </div> ); } // 类组件中的状态管理 class Counter extends React.Component { constructor(props) { super(props); this.state = { count: 0 }; } render() { return ( <div> <p>You clicked {this.state.count} times</p> <button onClick={() => this.setState({ count: this.state.count + 1 })}>Click me</button> </div> ); } } ``` 状态的更新可以通过 `setState`(类组件)或 `useState` 返回的更新函数(函数组件)来实现。此外,类组件还可以通过生命周期方法(如 `componentDidMount` 和 `componentWillUnmount`)来处理组件的创建和销毁过程[^2]。 #### 5. 事件处理 React 的事件处理方式与 HTML 类似,但有一些关键区别。事件名使用驼峰命名法,事件处理函数需要通过 JSX 传递。 ```jsx function Button() { const handleClick = () => { alert('Button clicked!'); }; return <button onClick={handleClick}>Click me</button>; } ``` 事件处理函数可以直接在 JSX 中定义,也可以作为组件的属性传递。 #### 6. 组件通信 组件之间的通信可以通过 `props` 来实现。父组件可以通过传递 `props` 给子组件,而子组件可以通过回调函数将数据传递回父组件。 ```jsx function ParentComponent() { const [message, setMessage] = React.useState(''); const handleChildEvent = (data) => { setMessage(data); }; return ( <div> <ChildComponent onMessage={handleChildEvent} /> <p>Message from child: {message}</p> </div> ); } function ChildComponent(props) { const sendMessage = () => { props.onMessage('Hello from child!'); }; return <button onClick={sendMessage}>Send Message</button>; } ``` 通过 `props`,父组件和子组件可以轻松地交换数据。 #### 7. 搭建 React 开发环境 React 的开发环境可以通过 `create-react-app` 快速搭建。运行以下命令即可创建一个新的 React 项目: ```bash npx create-react-app my-app cd my-app npm start ``` 该命令会自动配置开发环境,包括 Webpack、Babel 等工具,帮助开发者快速开始 React 开发[^1]。 #### 8. 实战案例:TodoList 应用 通过一个简单的 TodoList 应用,可以更好地理解 React 的实际应用。以下是一个基础的 TodoList 示例: ```jsx function TodoList() { const [todos, setTodos] = React.useState([]); const [input, setInput] = React.useState(''); const handleAdd = () => { if (input.trim() !== '') { setTodos([...todos, input]); setInput(''); } }; return ( <div> <input type="text" value={input} onChange={(e) => setInput(e.target.value)} placeholder="Enter a todo" /> <button onClick={handleAdd}>Add</button> <ul> {todos.map((todo, index) => ( <li key={index}>{todo}</li> ))} </ul> </div> ); } ``` 此示例展示了如何使用状态管理、事件处理和动态渲染列表数据。 #### 9. React Native 简单项目 React Native 是基于 React 的框架,用于构建跨平台的移动应用。以下是一个简单的 React Native 组件示例: ```jsx import React from 'react'; import { View, Text } from 'react-native'; function MyComponent() { return ( <View> <Text>Hello, React Native!</Text> </View> ); } ``` React Native 的组件与 React 类似,但针对移动设备进行了优化,支持原生组件和平台特定的功能[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值