博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React实践debug:JSX输出的限制(存疑)
阅读量:7254 次
发布时间:2019-06-29

本文共 2888 字,大约阅读时间需要 9 分钟。

今天在练习React构建组件的时候遇到一个问题。

由于文档中反复提倡将组件尽可能按功能单位分解复用。在练习用React做一个todolist时候,我把todolist分解成两部分:

class Todolist = class Writedown + class Todo;

其中 class Writedown返回 一个input和一个button 以接收和确定 用户输入的文本。

 class Todo 是一个li,展示todo事项并带有删除事项的span。之所以抽取li标签作为Todo组件是考虑到以后扩展功能,如对单个事项添加修改文本、置顶、标记已完成等等。

但是在写完class Todo的时候发现检测工具却报错,说Todolist的constructor构造器出现Syntax Error。

Are you kdding me?

最后发现是 class Todo 引发的问题,这次的报错完全不真实,并误导了我。。反复排查,我怀疑是render返回的JSX受到HTML类型约束.

在vue中,我们的自定义组件也一样,当DOM模板解析时,也受到HTML的限制,在table、ul等元素中限制了其包裹的html标签:

<table><tr is="my-row"></tr></table>

我们只能在tr 中用借用is特性绑定自定义组件my-row。

我这次在子组件中返回li,React居然报错说我有个syntax error,并指出是unexpected token,真是一脸懵逼。。。。

----------------------------------------------------------------------------------------

但是在官网中,有个例子是function组件返回li,这让我很疑惑。.

这问题先记下,这两天弄清楚。

 ----------------------9月4号晚  更新--------------------------------

然后发现。。返回li确实没有问题。。。

这实在是最难接受的情况了。浏览器不再报错,但是代码结构是和原来差不多的。

1   class Write extends React.Component { 2     constructor(props){ 3       super(props); 4       this.handle=this.handle.bind(this); 5     } 6     handle(){ 7       const text=document.getElementById('todoIn').value; 8       this.props.onWriteDown(text); 9     }10     render(){11      return (12      
13
14
15
16 );17 }18 }19 //Todo组件输出li,接收delete方法20 class Todo extends React.Component {21 constructor(props){22 super(props);23 this.handle=this.handle.bind(this);24 }25 handle(){26 }27 render(){28 return (29
  • {
    this.props.mes}
  • 30 );31 }32 }33 34 //Todolist组件,用todolist数组操作、存储事项,交互后赋值给state,也就是说state接收的是副本。35 class Todolist extends React.Component {36 constructor (props) {37 super(props);38 this.n=0;39 this.state={list:[]};40 this.todolist=[];41 this.handle=this.handle.bind(this);42 this.handle_del=this.handle_del.bind(this);43 }44 handle (m) {45 this.todolist.push({thing:m,vid:this.n++});46 this.setState({list:this.todolist});47 }48 handle_del (id) {49 let d =0;50 this.todolist.forEach((v,i)=>{51 if(v.vid==id){52 d=i;53 }54 });55 this.todolist.splice(d,1);56 this.setState({list:this.todolist});57 }58 render(){59 var that = this;60 var todo=[];61 this.state.list.forEach(function(v,i,a){62 let id = v.vid.toString();63 console.log(v.thing)64 let temp=
    that.handle_del(id)} mes={v.thing} >
    ;65 todo.push(temp);66 });67 return(68
    69
    70
      71 {todo}72
    73
    74 );75 }76 }77 78 ReactDOM.render(79
    ,80 document.getElementById('example')81 );

        不过现在可以确定的是,JSX的可以输出li、tr等。

     

    转载于:https://www.cnblogs.com/alan2kat/p/7474052.html

    你可能感兴趣的文章
    php 5.6.11添加模块
    查看>>
    matlab-线性代数 根据二次型写矩阵
    查看>>
    Win 7 deskhelp
    查看>>
    Sybase SQL Anywhere 7 数据库修复成功
    查看>>
    发展到1Gbps及其以上的速度
    查看>>
    TurboMail为企业提供海量投递邮件群发系统
    查看>>
    Linux系统命令Cut使用
    查看>>
    我的友情链接
    查看>>
    chrome 跨域设置-(完善博客内容)
    查看>>
    12月8日学习内容整理:ORM中的创建多表关系,基于多表关系的插入记录,基于对象的跨表查询...
    查看>>
    利用nginx实现负载均衡
    查看>>
    【EXCRT模板】POJ2891/LuoGu4777Strange Way to Express Integers拓展中国剩余定理
    查看>>
    Python基础24_正则表达式,re模块,
    查看>>
    mysql 开源 ~ canal+otter系列(2)
    查看>>
    跟我一起写 Makefile (Linux )
    查看>>
    CC2640R2F&TI-RTOS 拿到 TI CC2640R2F 开发板 第二件事就是 LED 驱动 ,点个灯
    查看>>
    ELASTIC SEARCH 性能调优
    查看>>
    Java并发总结(三):中断线程
    查看>>
    Beer Refrigerator
    查看>>
    hadoop输入分片计算(Map Task个数的确定)
    查看>>