React的基本知识:事件监听器、Props和State的区分、改变state的方法、使用回调函数改变state、使用三元运算符改变state

news2024/11/25 13:43:05

这篇教学文章涵盖了大量的React基本知识。
包括:

  • 事件监听器
  • Props和State的区分
  • 改变state的方法
  • 使用回调函数改变state
  • 使用三元运算符改变state
  • 处理state中的数组
  • 处理state中的object
  • 条件渲染 &&
  • 条件渲染 三元运算符
  • React中的forms

1. Event Listeners

在React中,事件监听器(Event Listeners)是用于响应用户操作(如点击、输入、鼠标移动等)的函数。
React中的事件监听器通常以camelCase形式命名,而不是使用HTML中的小写命名。例如,HTML中的onclick在React中写作onClick。
在React组件中,你可以在JSX中直接添加事件监听器。这些监听器是作为组件的属性添加的,其值是一个函数,当事件触发时,这个函数会被调用。

export default function App(){
  function handleClick(){
    console.log("I was clicked!")
  }
  function handleOnMouseOver (){
    console.log("MouseOver")
  }

  return (
    <div>
      <img 
        src="https://picsum.photos/640/360"
        onMouseOver={handleOnMouseOver}
      />
      <button onClick={handleClick}>Click me</button>
    </div>
  )
}

2. Props vs. State

“Props” refers to the properties being passed into a component in order for it to work correctly, similar to how a function receives parameters. A component receiving props is not allowed to modify those props. (i.e. they are “immutable”)

“State” refers to values that are managed by the component, similar to variables declared inside a function. Anytime you have changing values that should be saved/displayed, you will likely be using state.

在React中,组件的数据管理主要通过两种属性来实现:props(属性)和state(状态)。理解它们之间的区别对于构建有效的React应用至关重要。
Props(属性)

  • 不可变性:Props是从父组件传递到子组件的数据,它们是不可变的。这意味着一旦props被传递给组件,组件就不能直接修改这些props的值。如果需要改变props的值,必须通过父组件来完成。
  • 单向数据流:Props支持React的单向数据流原则,即数据只能从父组件流向子组件,这有助于避免数据流的混乱和应用状态的不可预测性。

State(状态)

  • 可变性:State是组件内部管理的数据,它可以在组件的生命周期内被改变。State的变化会触发组件的重新渲染。
  • 组件内部管理:State是私有的,只能在声明它的组件内部被直接访问和修改。State的变化通常是由于用户交互或程序逻辑的需要。
  • 触发渲染:当组件的state发生变化时,React会重新渲染组件,以确保UI与最新的状态保持同步。

3. Changing State

在React中,“changing state”(改变状态)是指更新组件内部的状态(state)。状态是React组件的私有数据,它可以帮助组件记录和响应用户操作或其他事件。当状态发生变化时,React会重新渲染组件,以确保UI与最新的状态保持同步。

改变状态的方法
在类组件中,状态通过this.setState()方法更新,在函数组件中,状态通过useState钩子(hook)的设置函数(setter function)更新。

类组件中改变状态
在类组件中,状态是使用this.state来声明的,而this.setState()方法用来更新状态。

函数组件中改变状态
在函数组件中,useState钩子允许你添加状态到函数组件中。useState返回一个数组,其中包含当前状态值和一个可以更新该状态的函数。


import React from "react"

export default function App(){

  const [isImportant, setIsImportant] = React.useState("YES")
  function handleClick(){
    setIsImportant("NO")
  }
  return (
    <div>
      <h1>Is state important to know?</h1>
      <div onClick={handleClick}>
        <h1>{isImportant}</h1>
      </div>
    </div>
  )

  
}

4. Changing state with a callback function

在React中,使用回调函数(callback function)来改变状态是一种常见的做法,尤其是在你需要基于当前状态来更新状态时。这种模式允许你在状态更新时立即获取最新的状态值,这对于执行依赖于前一个状态的计算特别有用。


import React from "react"

export default function App(){
  const [count, setCount] = React.useState(0)

  function add(){
    setCount(prevCount => prevCount+1)
  }
  function subtract(){
    setCount(prevCount => prevCount-1)
  }

  return (
    <div>
      <button onClick={subtract}>-</button>
      <div>
        <h1>{count}</h1>
      </div>
      <button onClick={add}>+</button>
    </div>
  )

  
}

5. Changing state: ternary

在React中,使用三元运算符(ternary operator)来改变状态是一种简洁的方式来根据条件选择新的状态值。三元运算符是一种表达式,它有三个操作数:一个条件、一个真值和一个假值。如果条件为真,则返回真值;如果条件为假,则返回假值。

import React from "react"

export default function App(){

  const [isGoingOut, setIsGoingOut] = React.useState(true)

  function changeMind(){
    setIsGoingOut(prevState => !prevState)
  }

  return (
    <div>
      <h1>Do I feel like going out tonight?</h1>
      <div onClick={changeMind}>
        <h1>{isGoingOut ? "Yes" : "No"}</h1>
      </div>
    </div>
  )
}

6. Complex State: arrays

在React中处理复杂状态,尤其是涉及到数组时,我们需要特别小心,因为数组是引用类型直接修改数组不会触发组件的重新渲染。以下是一些关于如何在React中处理复杂状态,特别是数组的要点:

  1. 不要直接修改状态
    直接修改数组(如通过索引赋值或使用push、pop等方法)不会触发组件的重新渲染。这是因为React使用浅比较来检测状态的变化。因此,任何对数组的修改都应该通过创建一个新数组来完成,以确保状态的变化能够被React检测到。
  2. 使用函数式更新
    在函数组件中,当需要基于当前状态来更新数组时,应该使用函数式更新。这意味着传递一个函数给setState(或在useState中的设置函数),这个函数接收当前状态作为参数,并返回新的状态。
import React from "react"

export default function App(){

  const [thingsArray, setThingsArray] = React.useState(["Thing 1", "Thing 2"])

  function addItem(){
    setThingsArray(prevState => {
      return [...prevState, `Thing ${prevState.length + 1}`]
    })
  }

  const thingsElements = thingsArray.map(thing => <p key={thing}>{thing}</p>)

  return (
    <div>
      <button onClick={addItem}>Add Item</button>
      {thingsElements}
    </div>
  )

  
}

在这个例子中,我们通过扩展运算符…来创建一个新数组,包含旧数组的所有元素以及新添加的元素,这样可以确保状态的变化。

7. Complex state: objects

在React中处理复杂状态,尤其是涉及到对象时,与处理数组类似,需要特别注意不可变性(immutability)。这是因为React依赖于比较状态的新旧值来决定是否重新渲染组件。如果直接修改对象,React可能无法检测到状态的变化,从而不会触发组件的重新渲染。

  1. 不要直接修改状态
    直接修改对象(如添加、删除或修改对象的属性)不会触发组件的重新渲染。因此,任何对对象状态的修改都应该通过创建一个新对象来完成。
  2. 使用函数式更新
    在函数组件中,当需要基于当前状态来更新对象时,应该使用函数式更新。这意味着传递一个函数给setState(或在useState中的设置函数),这个函数接收当前状态作为参数,并返回新的状态。
import React from "react"

export default function App(){

  const [contact, setContact] = React.useState({
    firstName: "John",
    lastName: "Doe",
    phone: "+1 (719) 555-1212",
    email: "itsmyrealname@example.com",
    isFavorite: true
  })

  let starIcon = contact.isFavorite ? "star-filled.png" : "star-empty.png"

  function toggleFavorite(){
    console.log("Toggle Favorite")
  }

  return (
    <main>
      <article>
        <img src="images/user.png" />
        <div>
          <img
            src={`images/${starIcon}`}
            onClick={toggleFavorite}
          />
          <h2>
            {contact.firstName} {contact.lastName}
          </h2>
          <p>{contact.phone}</p>
          <p>{contact.email}</p>
        </div>
      </article>
    </main>
  )

  
}

在这里插入图片描述
star-empty.png
在这里插入图片描述
star-filled.png
在这里插入图片描述
user.png

8. Complex state: updating state object

在这个例子中,我们通过扩展运算符…来创建一个新对象,包含旧对象的所有属性以及新修改的属性,这样可以确保状态的变化能够被React检测到。

import React from "react"

export default function App(){

  const [contact, setContact] = React.useState({
    firstName: "John",
    lastName: "Doe",
    phone: "+1 (719) 555-1212",
    email: "itsmyrealname@example.com",
    isFavorite: true
  })

  let starIcon = contact.isFavorite ? "star-filled.png" : "star-empty.png"

  function toggleFavorite(){
    setContact(prevContact => ({
      ...prevContact,
      isFavorite: !prevContact.isFavorite
    }))
  }

  return (
    <main>
      <article>
        <img src="images/user.png" />
        <div>
          <img
            src={`images/${starIcon}`}
            onClick={toggleFavorite}
          />
          <h2>
            {contact.firstName} {contact.lastName}
          </h2>
          <p>{contact.phone}</p>
          <p>{contact.email}</p>
        </div>
      </article>
    </main>
  )

  
}

9. Flip the box

App.jsx

import React from "react"
import boxes from "../public/components/boxes";
import Box from "../public/components/Box";

export default function App(){

  const [squares, setSquares] = React.useState(boxes)

  const squareElements = squares.map(square => (
    <Box key={square.id} on={square.on} />
  ))

  return (
    <main>
      {squareElements}
    </main>
  )

  
}

boxes.jsx

export default [
    {
        id: 1,
        on: true
    },   
    {
        id: 2,
        on: false
    },   
    {
        id: 3,
        on: true
    },   
    {
        id: 4,
        on: true
    },   
    {
        id: 5,
        on: false
    },   
    {
        id: 6,
        on: false
    },   
]

Box.jsx

import React from "react"

export default function Box(props) {
    const [on, setOn] = React.useState(props.on)

    const styles = {
        backgroundColor: on ? "#222222" : "transparent"
    }

    function toggle(){
        setOn(prevOn => !prevOn)
    }

    return (
        <div 
            style={styles} 
            className="box"
            onClick={toggle}    
        ></div>
    )
}

index.css

* {
  box-sizing: border-box;
}

body {
  font-family: "Karla", sans-serif;
  margin: 0;
}

.box {
  height: 100px;
  width: 100px;
  border: 1px solid black;
  display: inline-block;
  margin-right: 4px;
  border-radius: 5px;
}

10. Flip the box (use ternary operator)

App.jsx

import React from "react"
import boxes from "../public/components/boxes";
import Box from "../public/components/Box";

export default function App(){

  const [squares, setSquares] = React.useState(boxes)

  function toggle(id) {
    setSquares(prevSquares => {
      return prevSquares.map((square) => {
        return square.id === id ? {...square, on: !square.on} : square
      })
    })
  }

  const squareElements = squares.map(square => (
    <Box 
      key={square.id}
      on={square.on}
      toggle={() => toggle(square.id)} />
  ))

  return (
    <main>
      {squareElements}
    </main>
  )

  
}

Box.jsx

import React from "react"

export default function Box(props) {

    const styles = {
        backgroundColor: props.on ? "#222222" : "transparent"
    }

    return (
        <div 
            style={styles} 
            className="box"
            onClick={props.toggle}    
        ></div>
    )
}

11. Conditional rendering: &&

在React中,条件渲染是指根据某些条件来决定是否渲染某些组件或元素。这可以通过多种方式实现,包括使用JavaScript的逻辑与(&&)操作符。逻辑与操作符&&在条件渲染中非常有用,因为它允许你在同一个表达式中进行条件检查和元素渲染。
使用&&进行条件渲染
当你使用&&操作符时,如果其左边的表达式为真(truthy),则整个表达式的结果将取决于右边的表达式。在JSX中,这可以用来直接根据条件渲染元素。


import React from "react"
import boxes from "../public/components/boxes";
import Box from "../public/components/Box";

export default function App(){

  const [messages, setMessages] = React.useState(["a", "b", "c"])
  return (
    <div>
      {
        messages.length > 0 &&
        <h1>You have {messages.length} unread messages!</h1>
      }
    </div>
  )
 
}

12. Conditional rendering: ternary

在React中,条件渲染是指根据条件来决定是否渲染某些组件或元素。三元运算符(ternary operator)是一种常用的JavaScript表达式,用于基于条件进行快速的“if-else”判断,它在React的条件渲染中也非常有用。

condition ? expressionIfTrue : expressionIfFalse;
  • condition:一个布尔表达式,其结果为true或false。
  • expressionIfTrue:如果condition为true,则返回这个表达式的值。
  • expressionIfFalse:如果condition为false,则返回这个表达式的值。

你可以在JSX中直接使用三元运算符来决定渲染哪个元素或组件。

import React from "react"
import boxes from "../public/components/boxes";
import Box from "../public/components/Box";

export default function App(){
  const [messages, setMessages] = React.useState(["a"])
  return (
    <div>
      {
        messages.length === 0 ?
        <h1>You're all caught up!</h1> :
        <h1>You have {messages.length} unread {messages.length > 1 ? "messages" : "message"}</h1>
      }
    </div>
  )
  
}

13. Conditional rendering

  1. What is “conditional rendering”?
    When we want to only sometimes display something on the page
    based on a condition of some sort

  2. When would you use &&?
    When you want to either display something or NOT display it

  3. When would you use a ternary?
    When you need to decide which thing among 2 options to display

  4. What if you need to decide between > 2 options on
    what to display?
    Use an if...else if... else conditional or a switch statement

14. Watch for input changes in React

在React中,监视输入变化是一个常见的需求,尤其是在处理表单时。这可以通过几种方式实现,包括使用状态(state)和效果(effects)。
使用State和Effects监视输入变化
在React中,你可以通过维护一个状态来监视输入的变化。当输入变化时,更新这个状态,从而触发组件的重新渲染。


import React from "react"


export default function App(){


  const [firstName, setFirstName] = React.useState("")

  console.log(firstName)

  function handleChange(event){
    setFirstName(event.target.value)
  }

  return (
    <form>
      <input
        type="text"
        placeholder="First Name"
        onChange={handleChange}
      />
    </form>
  )
  
}

在这个例子中,每次用户输入时,handleChange函数都会被调用,并更新firstName状态,这会导致组件重新渲染并显示最新的输入值。

15. Form state object


import React from "react"


export default function App(){


  const [formData, setFormData] = React.useState(
    {firstName: "", lastName: "", email: ""}
  )

  console.log(formData)

  function handleChange(event){
    setFormData(prevFormData => {
      return {
        ...prevFormData,
        [event.target.name]: event.target.value
      }
    })
  }

  return (
    <form>
      <input
        type="text"
        placeholder="First Name"
        onChange={handleChange}
        name="firstName"
      />
      <input
        type="text"
        placeholder="Last Name"
        onChange={handleChange}
        name="lastName"
      />
      <input
        type="email"
        placeholder="Email"
        onChange={handleChange}
        name="email"
      />
    </form>
  )

  

  
}

16. Forms in React: textarea


import React from "react"


export default function App(){


  const [formData, setFormData] = React.useState(
    {firstName: "", lastName: "", email: "", comments: ""}
  )

  console.log(formData.comments)

  function handleChange(event){
    setFormData(prevFormData => {
      return {
        ...prevFormData,
        [event.target.name]: event.target.value
      }
    })
  }

  return (
    <form>
      <input
        type="text"
        placeholder="First Name"
        onChange={handleChange}
        name="firstName"
        value={formData.firstName}
      />
      <input
        type="text"
        placeholder="Last Name"
        onChange={handleChange}
        name="lastName"
        value={formData.lastName}
      />
      <input
        type="email"
        placeholder="Email"
        onChange={handleChange}
        name="email"
        value={formData.email}
      />
      <textarea
        value={formData.comments}
        placeholder="Comments"
        onChange={handleChange}
        name="comments"
      />
    </form>
  )

  

  
}

17. Forms in React: checkbox


import React from "react"


export default function App(){

  const [formData, setFormData] = React.useState(
    {
      firstName: "", 
      lastName: "", 
      email: "", 
      comments: "",
      isFriendly: true
    }
  )

  function handleChange(event){
    const {name, value, type, checked} = event.target
    setFormData(prevFormData => {
      return {
        ...prevFormData,
        [name]: type === "checkbox" ? checked : value
      }
    })
  }

  return (
    <form>
      <input
        type="text"
        placeholder="First Name"
        onChange={handleChange}
        name="firstName"
        value={formData.firstName}
      />
      <input
        type="text"
        placeholder="Last Name"
        onChange={handleChange}
        name="lastName"
        value={formData.lastName}
      />
      <input
        type="email"
        placeholder="Email"
        onChange={handleChange}
        name="email"
        value={formData.email}
      />
      <textarea
        value={formData.comments}
        placeholder="Comments"
        onChange={handleChange}
        name="comments"
      />
      <input
        type="checkbox"
        id="isFriendly"
        checked={formData.isFriendly}
        onChange={handleChange}
        name="isFriendly"
      />
      <label htmlFor="isFriendly">Are you friendly?</label>
      <br />
    </form>
  )

  

  
}

18. Forms in React: radio buttons


import React from "react"


export default function App(){

  const [formData, setFormData] = React.useState(
    {
      firstName: "", 
      lastName: "", 
      email: "", 
      comments: "",
      isFriendly: true,
      employment: ""
    }
  )

  console.log(formData.employment)

  function handleChange(event){
    const {name, value, type, checked} = event.target
    setFormData(prevFormData => {
      return {
        ...prevFormData,
        [name]: type === "checkbox" ? checked : value
      }
    })
  }

  return (
    <form>
      <input
        type="text"
        placeholder="First Name"
        onChange={handleChange}
        name="firstName"
        value={formData.firstName}
      />
      <input
        type="text"
        placeholder="Last Name"
        onChange={handleChange}
        name="lastName"
        value={formData.lastName}
      />
      <input
        type="email"
        placeholder="Email"
        onChange={handleChange}
        name="email"
        value={formData.email}
      />
      <textarea
        value={formData.comments}
        placeholder="Comments"
        onChange={handleChange}
        name="comments"
      />
      <input
        type="checkbox"
        id="isFriendly"
        checked={formData.isFriendly}
        onChange={handleChange}
        name="isFriendly"
      />
      <label htmlFor="isFriendly">Are you friendly?</label>
      <br />
      <br />

      <fieldset>
        <legend>Current employment status</legend>

        <input 
          type="radio"
          id="unemployed"
          name="employment"
          value="unemployed"
          checked={formData.employment === "unemployed"}
          onChange={handleChange}
        />
        <label htmlFor="unemployed">Unemployed</label>
        <br />

        <input 
          type="radio"
          id="part-time"
          name="employment"
          value="part-time"
          checked={formData.employment === "part-time"}
          onChange={handleChange}
        />
        <label htmlFor="part-time">Part-time</label>
        <br />

        <input 
          type="radio"
          id="full-time"
          name="employment"
          value="full-time"
          checked={formData.employment === "full-time"}
          onChange={handleChange}
        />
        <label htmlFor="full-time">Full-time</label>
        <br />


      </fieldset>
    </form>
  )

  

  
}

19. Forms in React: Select and options


import React from "react"


export default function App(){

  const [formData, setFormData] = React.useState(
    {
      firstName: "", 
      lastName: "", 
      email: "", 
      comments: "",
      isFriendly: true,
      employment: "",
      favColor: ""
    }
  )

  console.log(formData.favColor)

  function handleChange(event){
    const {name, value, type, checked} = event.target
    setFormData(prevFormData => {
      return {
        ...prevFormData,
        [name]: type === "checkbox" ? checked : value
      }
    })
  }

  return (
    <form>
      <input
        type="text"
        placeholder="First Name"
        onChange={handleChange}
        name="firstName"
        value={formData.firstName}
      />
      <input
        type="text"
        placeholder="Last Name"
        onChange={handleChange}
        name="lastName"
        value={formData.lastName}
      />
      <input
        type="email"
        placeholder="Email"
        onChange={handleChange}
        name="email"
        value={formData.email}
      />
      <textarea
        value={formData.comments}
        placeholder="Comments"
        onChange={handleChange}
        name="comments"
      />
      <input
        type="checkbox"
        id="isFriendly"
        checked={formData.isFriendly}
        onChange={handleChange}
        name="isFriendly"
      />
      <label htmlFor="isFriendly">Are you friendly?</label>
      <br />
      <br />

      <fieldset>
        <legend>Current employment status</legend>

        <input 
          type="radio"
          id="unemployed"
          name="employment"
          value="unemployed"
          checked={formData.employment === "unemployed"}
          onChange={handleChange}
        />
        <label htmlFor="unemployed">Unemployed</label>
        <br />

        <input 
          type="radio"
          id="part-time"
          name="employment"
          value="part-time"
          checked={formData.employment === "part-time"}
          onChange={handleChange}
        />
        <label htmlFor="part-time">Part-time</label>
        <br />

        <input 
          type="radio"
          id="full-time"
          name="employment"
          value="full-time"
          checked={formData.employment === "full-time"}
          onChange={handleChange}
        />
        <label htmlFor="full-time">Full-time</label>
        <br />
        </fieldset>

        <label htmlFor="favColor">What is your favorite color?</label>
        <br />
        <select 
          id="favColor"
          value={formData.favColor}
          onChange={handleChange}
          name="favColor"
        >
          <option value="">-- Choose --</option>
          <option value="red">Red</option>
          <option value="orange">Orange</option>
          <option value="yellow">Yellow</option>
          <option value="green">Green</option>
          <option value="blue">Blue</option>
          <option value="indigo">Indigo</option>
          <option value="violet">Violet</option>
        </select>


      
    </form>
  )

  

  
}

20. Forms in React: Submitting the form


import React from "react"


export default function App(){

  const [formData, setFormData] = React.useState(
    {
      firstName: "", 
      lastName: "", 
      email: "", 
      comments: "",
      isFriendly: true,
      employment: "",
      favColor: ""
    }
  )


  function handleChange(event){
    const {name, value, type, checked} = event.target
    setFormData(prevFormData => {
      return {
        ...prevFormData,
        [name]: type === "checkbox" ? checked : value
      }
    })
  }

  function handleSubmit(event) {
    event.preventDefault()
    console.log(formData)
  }

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="text"
        placeholder="First Name"
        onChange={handleChange}
        name="firstName"
        value={formData.firstName}
      />
      <input
        type="text"
        placeholder="Last Name"
        onChange={handleChange}
        name="lastName"
        value={formData.lastName}
      />
      <input
        type="email"
        placeholder="Email"
        onChange={handleChange}
        name="email"
        value={formData.email}
      />
      <textarea
        value={formData.comments}
        placeholder="Comments"
        onChange={handleChange}
        name="comments"
      />
      <input
        type="checkbox"
        id="isFriendly"
        checked={formData.isFriendly}
        onChange={handleChange}
        name="isFriendly"
      />
      <label htmlFor="isFriendly">Are you friendly?</label>
      <br />
      <br />

      <fieldset>
        <legend>Current employment status</legend>

        <input 
          type="radio"
          id="unemployed"
          name="employment"
          value="unemployed"
          checked={formData.employment === "unemployed"}
          onChange={handleChange}
        />
        <label htmlFor="unemployed">Unemployed</label>
        <br />

        <input 
          type="radio"
          id="part-time"
          name="employment"
          value="part-time"
          checked={formData.employment === "part-time"}
          onChange={handleChange}
        />
        <label htmlFor="part-time">Part-time</label>
        <br />

        <input 
          type="radio"
          id="full-time"
          name="employment"
          value="full-time"
          checked={formData.employment === "full-time"}
          onChange={handleChange}
        />
        <label htmlFor="full-time">Full-time</label>
        <br />
        </fieldset>

        <label htmlFor="favColor">What is your favorite color?</label>
        <br />
        <select 
          id="favColor"
          value={formData.favColor}
          onChange={handleChange}
          name="favColor"
        >
          <option value="">-- Choose --</option>
          <option value="red">Red</option>
          <option value="orange">Orange</option>
          <option value="yellow">Yellow</option>
          <option value="green">Green</option>
          <option value="blue">Blue</option>
          <option value="indigo">Indigo</option>
          <option value="violet">Violet</option>
        </select>
        <br />
        <br />
        <button>Submit</button>


      
    </form>
  )

  

  
}

21. Sign up form practice


import React from "react"


export default function App(){

  const [formData, setFormData] = React.useState({
    email: "",
    password: "",
    passwordConfirm: "",
    joinedNewsletter: true
  })

  function handleChange(event){
    const {name, value, type, checked} = event.target
    setFormData(prevFormData => ({
      ...prevFormData,
      [name]: type === "checkbox" ? checked : value
    }))
  }

  function handleSubmit(event){
    event.preventDefault()
    if (formData.password === formData.passwordConfirm){
      console.log("Successfully signed up")
    } else {
      console.log("Passwords do not match")
      return
    }

    if(formData.joinedNewsletter){
      console.log("Thanks for signing up for our newsletter!")
    }
  }

  return (
    <div>
      <form onSubmit={handleSubmit}>
        <input 
          type="email"
          placeholder="Email address"
          name="email"
          onChange={handleChange}
          value={formData.email}
        />
        <input 
          type="password"
          placeholder="Password"
          name="password"
          onChange={handleChange}
          value={formData.password}
        />
        <input 
          type="password"
          placeholder="Confirm password"
          name="passwordConfirm"
          onChange={handleChange}
          value={formData.passwordConfirm}
        />

        <div>
          <input 
            id="okayToEmail"
            type="checkbox"
            name="joinedNewsletter"
            onChange={handleChange}
            checked={formData.joinedNewsletter}
          />
          <label htmlFor="okayToEmail">I want to join the newsletter</label>
        </div>
        <button>Sign up</button>
      </form>
    </div>
  )

  

  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2247331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript练习——文本与图形

要求实现下面这个效果&#xff1a; 观察图片&#xff0c;我们的需求如下&#xff1a; 准备画布和上下文&#xff1a;在开始绘制之前&#xff0c;需要有一个HTML5 <canvas> 元素&#xff0c;并且获取其绘图上下文&#xff08;context&#xff09;&#xff0c;这是进行绘图…

【线程】线程安全问题及解决措施

【线程】线程安全问题及解决措施 前言一、由“随机调度”引起的线程安全问题1.1现象1.2 原因1.3 解决办法1.4 不当加锁造成的死锁问题 二、由“系统优化”引起的线程安全问题2.1 内存可见性问题 / 指令重排序问题2.2 解决方案 前言 何为线程安全&#xff0c;即某段代码无论在单…

[开源]3K+ star!微软Office的平替工具,跨平台,超赞!

大家好&#xff0c;我是JavaCodexPro&#xff01; 数字化的当下&#xff0c;高效的办公工具是提升工作效率的关键&#xff0c;然而大家想到的一定是 Microsoft Office 办公软件&#xff0c;然而价格也是相当具有贵的性价比。 今天JavaCodexPro给大家分享一款超棒的开源办公套…

【大数据分析机器学习】分布式机器学习

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘&#xff0c;以提取有价值的信息和洞察。它结合了大数据技术、人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&a…

SOL链上的 Meme 生态发展:从文化到创新的融合#dapp开发#

一、引言 随着区块链技术的不断发展&#xff0c;Meme 文化在去中心化领域逐渐崭露头角。从 Dogecoin 到 Shiba Inu&#xff0c;再到更多细分的 Meme 项目&#xff0c;这类基于网络文化的加密货币因其幽默和社区驱动力吸引了广泛关注。作为近年来备受瞩目的区块链平台之一&…

一篇保姆式centos/ubuntu安装docker

前言&#xff1a; 本章节分别演示centos虚拟机&#xff0c;ubuntu虚拟机进行安装docker。 上一篇介绍&#xff1a;docker一键部署springboot项目 一&#xff1a;centos 1.卸载旧版本 yum remove docker docker-client docker-client-latest docker-common docker-latest doc…

Dubbo源码解析-Dubbo的线程模型(九)

一、Dubbo线程模型 首先明确一个基本概念&#xff1a;IO 线程和业务线程的区别 IO 线程&#xff1a;配置在netty 连接点的用于处理网络数据的线程&#xff0c;主要处理编解码等直接与网络数据 打交道的事件。 业务线程&#xff1a;用于处理具体业务逻辑的线程&#xff0c;可以…

前端全栈 === 快速入 门 Redis

目录 简介 通过 docker 的形式来跑&#xff1a; set、get 都挺简单&#xff1a; incr 是用于递增的&#xff1a; keys 来查询有哪些 key: redis insight GUI 工具。 list 类型 left push rpush lpop 和 rpop 自然是从左边和从右边删除数据。​编辑 如果想查看数据…

Python MySQL SQLServer操作

Python MySQL SQLServer操作 Python 可以通过 pymysql 连接 MySQL&#xff0c;通过 pymssql 连接 SQL Server。以下是基础操作和代码实战示例&#xff1a; 一、操作 MySQL&#xff1a;使用 pymysql python 操作数据库流程 1. 安装库 pip install pymysql2. 连接 MySQL 示例 …

编程语言之C++诞生记!

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C诞生的相关内容&#xff01; 关于【C诞…

核心差异:知识VS文档管理(+工具软件安利)

在讨论知识管理和文档管理时&#xff0c;我们经常会听到这两种说法被混淆使用。然而&#xff0c;它们各自服务于不同的目的&#xff0c;这一点至关重要。 想象一下&#xff0c;你是一名项目经理&#xff0c;面临以下两项任务&#xff1a; 存储最新的项目计划捕捉团队讨论中获…

医院挂号就诊系统(源码+数据库+报告)

基于SpringBoot的医院挂号就诊系统&#xff0c;系统包含三种角色&#xff1a;管理员、医生、用户,系统分为前台和后台两大模块&#xff0c;主要功能如下。 前台&#xff1a; - 首页&#xff1a;展示医院相关信息、推荐医生等内容。 - 健康教育&#xff1a;提供健康知识、文章等…

【热门主题】000065 探索人工智能学习框架:开启智能未来的钥匙

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…

《智慧教育实时数据分析推荐项目》详细分析

一、项目介绍 1、背景介绍 在互联网、移动互联网的带动下&#xff0c;教育逐渐从线下走向线上&#xff0c;在线教育近几年一直处于行业的风口浪尖&#xff0c;那随着基础设施的不断完善&#xff0c;用户需求也发生不少变化&#xff0c;因此传统教育机构、新兴互联网企业都在探…

使用LUKS对Linux磁盘进行加密

前言 本实验用于日常学习用&#xff0c;如需对存有重要数据的磁盘进行操作&#xff0c;请做好数据备份工作。 此实验只是使用LUKS工具的冰山一角&#xff0c;后续还会有更多功能等待探索。 LUKS&#xff08;Linux Unified Key Setup&#xff09;是Linux系统中用于磁盘加密的一…

在 cmd 输入 python.exe 后不报错也无反应的问题

在 cmd 输入 python.exe 后不报错&#xff1a;‘python.exe ’不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件&#xff0c;也无反应。只是显示这样一个弹窗&#xff1a; 查了下环境变量path&#xff0c;看看有什么地方有python.exe&#xff0c;发现原来在C:\Us…

10、PyTorch autograd使用教程

文章目录 1. 相关思考 1. 相关思考

如何在 Ubuntu 22 04 上安装和配置 Ansible 自动化平台

如何在 Ubuntu 22.04 上安装和配置 Ansible 自动化平台 简介 Ansible 是一个开源项目&#xff0c;并在 Github 上收获了 63k 的 star 。它是一个极其简单的 IT 自动化平台&#xff0c;使您的应用程序和系统更易于部署和维护。使用 SSH&#xff0c;以接近简单英语的语言实现从…

PowerMILL 客制化宏 - 用户菜单定义

用户右键菜单 在PowerMILL元素浏览器空白的地方右键弹出的菜单叫用户右键菜单。用户右键菜单可以调用宏或命令或用户二次开发的应用或批处理等等。 用户右键菜单定义 用户右键菜单需要建立一个没有扩展名的 “user_menu” 名称的文件&#xff0c;一般存放在 “C:\dcam\pmill2…

006 单片机嵌入式中的C语言与代码风格规范——常识

00 环境准备&#xff1a; 配置MDK支持C99 内置stdint.h介绍 stdint.h 是从 C99 中引进的一个标准 C 库的文件 路径&#xff1a;D:\MDK\ARM\ARMCC\include 01 C语言基础语法 一般的bug很有可能是C语言功底不扎实导致…… 1.结构体 由若干基本数据类型集合组成的一种自定义数…