React实践debug:JSX输出的限制(存疑)

react

今天在练习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,这让我很疑惑。https://facebook.github.io/react/docs/lists-and-keys.html#extracting-components-with-keys.

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

 ----------------------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 <div>

13 <input type="text" id="todoIn" />

14 <button onClick={this.handle}>confirm</button>

15 </div>

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 <li onClick={this.props.onDel}>{this.props.mes}</li>

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=<Todo key={id} onDel={() => that.handle_del(id)} mes={v.thing} ></Todo>;

65 todo.push(temp);

66 });

67 return(

68 <div>

69 <Write onWriteDown={this.handle} />

70 <ul>

71 {todo}

72 </ul>

73 </div>

74 );

75 }

76 }

77

78 ReactDOM.render(

79 <Todolist />,

80 document.getElementById('example')

81 );

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

以上是 React实践debug:JSX输出的限制(存疑) 的全部内容, 来源链接: utcz.com/z/383804.html

回到顶部