随便写点东西

2024-05-11 1302阅读

1 react的高阶组件

1.1 操纵组件的props、对组件的props进行增删;

随便写点东西
(图片来源网络,侵删)

1.2 复用组件逻辑

服用的组件逻辑,互不影响;比如高阶组件中复用了input框,输入内容是互不影响的;

1.3 可以通过配置装饰器来实现高阶组件(只能在类组件中使用)

之前:

import { test } from './test.jsx';
export default test(A);

现在:

import { test } from './test.jsx';
@test
export default A;

1.4 利用forwardRef,通过ref转发获取DOM节点

高阶组件test

export default class App extends React.Component {
  constructor() {
    super();
    this.testRef = React.createRef();
  }
  render() {
    return (
      

App Page

this.testRef} /
); }; componentDidMount() { console.log(this.testRef.current); } }

第一种情况:

export default function test(Comp) {
  class HOC extends React.Component {
    render() {
      return ...this.props} /;
    };
  }
  return HOC;
}

如果A组件不使用高阶组件,this.testRef.current指的是A组件实例;

A组件使用了高阶组件,this.testRef.current指的是高阶组件实例;

第二种情况:

命名forwardRef,将ref传下去

export default function test(Comp) {
  class HOC extends React.Component {
    render() {
      return ..this.props}/;
    };
  }
  return React.forwardRef((props, ref) => {
    return ...props} forwardRef={ref} /
  })
}
@test
class A extends React.Component {
  render() {
    return (
      this.props.forwardRef}
        

A Component

); }; }

this.testRef.current指的是A组件实例,可以拿到DOM节点

1.5 反向继承(可以做渲染劫持)

之前高阶组件传入一个组件,返回一个组件,返回的组件 extends React.Component,这种叫属性代理;

下面这种叫反向继承,可以做渲染劫持

export default function test(Comp) {
  return class extends Comp {
    render() {
      const element = super.render(); // super.render()返回虚拟DOM
      const newProps = element.type === 'div'
        ? { style: { color: '#f00' } }
        : { style: { color: '#0f0' } };
      return React.cloneElement(
        element,
        { ...this.props, ...newProps },
        element.props.children,
      );
    };
  }
}

2 受控组件和非受控组件

是否受控取决于 是否可以使用state控制输入框

像这样的输入框是非受控的,即使使用传递了初始值,JSX也只是指定了初始值,而非当前时刻的值,也属于非受控组件;

如果要渲染一个受控输入框,请传递 value 属性(或者向多选框和单选框按钮传递 checked);React将强制传递 value属性给输入框,通常可以通过声明一个 state 来控制输入框;

function Form() {
  const [firstName, setFirstName] = useState('');
  return (
    firstName}
      onChange={e = setFirstName(e.target.value)}
    />
  )
}

看下面的例子

  受控:
  非受控:
   setNum(num + 1)}>+1

点击按钮,受控组件值会变,但是非受控组件值不变,不受状态影响;

受控组件值不可以手动输入更改;非受控组件可以;

原因是受控组件没有加onChange,应该要配套使用;

那么如何获取受控组件和非受控组件的值?

获取受控组件的值:直接打印num即可;

获取非受控组件的值:通过获取元素document,再去获取元素的值;

或者使用ref

const dv = useRef(null);

  非受控:dv} defaultValue={num} /

dv.current.value可以获取非受控组件的值;

总结:

  1. defaultValue非受控,不随num值变化而变化;value受控,随num值变化而变化;
  2. defaultValue可以直接编辑;value不能直接编辑(需要配合onChange事件);
  3. 获取值:受控组件直接读取num值;非受控组件通过ref获取值

3 Redux

单一状态树 store

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]