这样写注释是错误的,如果放在Fragment标签外面还算正常,放在里面就不是注释
// 这样写注释是错误的
JSX
的注释,有两种写法
如果记不住,直接VSCode快捷键,Ctrl + /
可以这样理解,在jsx中写JavaScript代码,因此外面套入了{}
然后里边就是一个多行的JavaScript注释
如果要使用单行注释,需要使用第二种写法
{
//正确注释的写法
}
就是需要进行换行,有些麻烦而且不优雅,推荐第一种注释方法
要添加样式,比如给文本框添加一个粗黄的边框,错误的步骤
src
目录下,新建一个style.css
样式文件.input {border: 3px solid #ae7000;}
Xiaojiejie.js
里引入,先用import
进行引入,能用import引入,都是webpack的功劳import './style.css'
JSX
加入class,这是错误的写法虽然页面是可以正常显示结果的,但是浏览器控制台会发现Warning
警告
index.js:1 Warning: Invalid DOM property `class`. Did you mean `className`?
at input
at div
at Xiaojiejie (http://localhost:3000/main.39b7f7cef4fa3aada48a.hot-update.js:51:5)
意思是要把class
换成className
,它是防止和js
中的class
类名冲突,因此要求换掉
html
解析如果想在文本框里输入一个标签,并进行渲染
默认是不会生效的,只会把标签打印到页面上
如果项目中有这种需求,可以使用dangerouslySetInnerHtml
属性来解决
{
this.state.list.map((item,index)=>{
return (
-
)
})
}
标签label是HTML中一个辅助标签
我们在文本框前面加入一个
这时我们想点击"加入服务"直接可以激活文本框,方便输入
按照html原本的思路,直接加个ID就可以
这时浏览器效果虽然正常,但是控制台里会有Warning警告
Warning: Invalid DOM property `for`. Did you mean `htmlFor`?
at label
at div
at Xiaojiejie (http://localhost:3000/static/js/main.chunk.js:193:5)
意思是不能使用for
,它容易和JavaScript里的for循环混淆,会提示你使用htmlfor
这时候就能实现点击后,激活标签了
工作中经常会看到程序老司机写代码是非常快的,他们使用了vscode中快速生成插件-Simple React Snippets
新建一个test.js来体验下代码快手
直接输入imrc
,就会快速生成最常用的import代码
import React, { Component } from 'react';
在写组件的时候,都需要写一个固定的基本格式
直接输入cc
,就会快速生成如下代码
class extends Component {
state = { }
render() {
return ( );
}
}
export default ;
还有很多快捷键,可以再插件里的说明文件中查看
这个插件建议熟练掌握,因为在老板眼里,代码编写速度的快慢直接跟我们的薪资有关,就算没什么关系,我们自己把时间剩下,去玩4399不香吗?
现在小姐姐服务菜单已经制作好了,但从头到尾只用了一个组件
在实际工作中肯定是团队开发,我们会把一个大功能分成不同的组件,
这就涉及了组件拆分的能力和知识
在src目录下,新建一个文件,XiaojiejieItem.js
然后先把最基础的结构写好,使用imrc
cc
快捷键生成
import React, { Component } from 'react';
class XiaojiejieItem extends Component {
render() {
return (
小姐姐
);
}
}
export default XiaojiejieItem;
写好后,就可以在Xiaojiejie.js
文件中用import进行引入
import XiaojiejieItem from './XiaojiejieItem'
Xiaojiejie
组件已经引入了新写的组件,原来的代码要如何修改才能把新组建加入?
先把原来的代码注释掉,或者删除掉
然后再最外层加入包裹元素 最后直接写入 现阶段整体Code 现在已经把组件进行了拆分,但还没有实现传值 上面我们把组件做了一个基本的拆分 但还是不能实现随着输入,显示输入得内容,这涉及到父组件向子组件传值 然后点击删除,相当于子组件向父组件传值 我们使用组件属性的形式,实现父组件给子组件传值 现在,Xiaojiejie是父组件,XiaojiejieItem是子组件 我们在 现在值已经传递过去了,接下来通过 父组件向子组件传递内容,靠属性的形式传递 要实现点击组件中的菜单项,删除菜单项,这里就涉及了子组件向父组件传递数据 首先绑定点击事件,这时候当然是在 打开F12进行预览,会发现console里显示了"哈哈哈"字样 但console里还有一个warning警告,这是要求循环时必须设置key值,我们需要修改 组件外还有层 绑定成功后,就要通过操作子组件删除父组件里的数据了 但React有明确规定,子组件不能操作父组件里的数据 所以要借助父组件的方法,来修改父组件的内容 要删除就要知道索引值 所以还是需要通过父组件传递给子组件,还是通过 然后修改 这时预览点击后会报错 这个错误是之前的老朋友,没有绑定 我们可以用之前的老方法绑定this 还有一种方法,是在构造函数里绑定(构造函数中绑定性能会高一些,特别是在高级组件开发中,会有很大的作用) 子组件要调用父组件方法,和传递数据差不多 只要在组件调用时,把方法传递给子组件就可以了 传递后,在 到此为止,我们就算实现了子组件向父组件传值 这是React体系中非常重要的,真正的React开发工作,每天写的就是各种组件,传值是组件之间产生联系的必要一环! React的特性中有个概念叫“单项数据流” 依旧使用服务菜单的Demo,我们在父组件中可以直接把this.state.list传递过来 父组件给子组件这样传值是没有问题的,但子组件只能使用这个值,而不能修改这个值 如果修改了,在子组件里这样写 就会报错 意思是 React可以模块化和组件化开发,在 React只针对这一个 我们可以在其他的div里加入任何内容,但是这种情况很少,希望大家还是统一技术栈 面试React时,经常会问到的一个问题是:函数式编程的好处是什么? React框架也是函数式编程,优势在大型多人开发的项目中会更加明显,让配合和交流都得心应手import React, { Component, Fragment } from 'react';
import XiaojiejieItem from './XiaojiejieItem';
import './style.css'
class Xiaojiejie extends Component {
// js的构造函数,由其他任何函数执行
constructor(props) {
super(props) // 调用父类的构造函数,固定写法
this.state = {
inputValue: '', // input中的值
list:['基础按摩','精油推背'] // 服务列表
}
}
render() {
return (
{
this.state.list.map((item,index)=>{
return (
//
父子组件的传值
父组件向子组件传值
XiaojiejieItem
组件中加入content
属性,然后给属性传递{item}
,这样就完成了父组件向子组件传值
return (
this.props.xxx
的形式进行接收import React, { Component } from 'react';
class XiaojiejieItem extends Component {
render() {
return (
子组件向父组件传递数据
XiaojiejieItem
组件中绑定了import React, { Component } from 'react';
class XiaojiejieItem extends Component {
render() {
return (
Xiaojiejie
组件的render
代码
{
this.state.list.map((item,index)=>{
return (
div
,还会有warning警告,去掉外面的div
{
this.state.list.map((item,index)=>{
return (
获取数组索引下标
props
属性的形式进行传递this.state.list.map((item,index)=>{
return (
XiaojiejieItem
组件中的handleClick
方法handleClick(){
// console.log('哈哈哈')
console.log(this.props.index)
}
TypeError: Cannot read property 'props' of undefined
bind(this)
return (
constructor
绑定this方法import React, { Component } from 'react'; //imrc
class XiaojiejieItem extends Component { //cc
//--------------主要代码--------start
constructor(props){
super(props)
this.handleClick=this.handleClick.bind(this)
}
//--------------主要代码--------end
render() {
return (
子组件调用父组件方法
this
绑定,如果不绑定子组件是没办法找到这个父组件的方法的return (
XiaojiejieItem
组件里直接使用就行handleClick(){
console.log(this.props.index)
this.props.deleteItem(this.props.index)
}
单向数据流与函数式编程
单向数据流
return (
handleClick(){
console.log(this.props.index)
this.props.deleteItem(this.props.index)
//关键代码-------------------start
this.props.list=[]
//关键代码-------------------end
}
TypeError: Cannot assign to read only property 'list' of object '#
list
是只读的,单向数据流
如果要改变这里面的值,就是通过传递父组件的方法和其他框架配合使用
React
和Jquery
也能一起使用/public/index.html
中我们可以看到DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Web site created using create-react-app"
/>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<title>Leon zhaotitle>
head>
<body>
<noscript>You need to enable JavaScript to run this app.noscript>
<div id="root">div>
body>
html>
函数式编程