Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.68 KB | None | 0 0
  1. import React, { Component } from "react";
  2. import produce from "immer";
  3.  
  4. const SlotSelector: React.SFC<any> = ({ handleChange, selectedValue }) => {
  5. return (
  6. <select onChange={handleChange} value={selectedValue}>
  7. <option value="-1">SlotSelector</option>
  8. <option value="1">Option #1</option>
  9. <option value="2">Option #2</option>
  10. <option value="3">Option #3</option>
  11. </select>
  12. );
  13. };
  14.  
  15. export class SlotManager extends Component<any, any> {
  16. constructor(props: any) {
  17. super(props);
  18. this.state = { slots: [] };
  19. }
  20.  
  21. addSlot = (e: React.ChangeEvent<HTMLSelectElement>) => {
  22. const {
  23. target: { value }
  24. } = e;
  25. this.setState(
  26. produce(draft => {
  27. draft.slots.push(value);
  28. })
  29. );
  30. };
  31.  
  32. updateSlot = (idx: number, val: string) => {
  33. this.setState(
  34. produce(this.state, draft => {
  35. draft.slots[idx] = val;
  36. })
  37. );
  38. };
  39.  
  40. removeSlot = (idx: number) => {
  41. this.setState(
  42. produce(this.state, draft => {
  43. draft.slots.splice(idx, 1);
  44. })
  45. );
  46. };
  47.  
  48. render() {
  49. return (
  50. <>
  51. {this.state.slots.map((v: string, idx: number) => (
  52. <SlotSelector
  53. handleChange={(e: React.ChangeEvent<HTMLSelectElement>) =>
  54. e.target.value === "-1"
  55. ? this.removeSlot(idx)
  56. : this.updateSlot(idx, e.target.value)
  57. }
  58. selectedValue={v}
  59. key={idx}
  60. />
  61. ))}
  62. <SlotSelector
  63. key="new"
  64. handleChange={this.addSlot}
  65. selectedValue="-1"
  66. />
  67. </>
  68. );
  69. }
  70. }
  71.  
  72. class App extends Component {
  73. render() {
  74. return <SlotManager />;
  75. }
  76. }
  77.  
  78. export default App;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement