Ant-design: ์ง‘๊ณ„ ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ”์— ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 04์›” 11์ผ  ยท  78์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: ant-design/ant-design

๋ฒ„์ „

2.9.1

ํ™˜๊ฒฝ

๋ธŒ๋ผ์šฐ์ €

๋ณต์ œ ๋งํฌ

http : // ์—†์Œ

์žฌํ˜„ ๋‹จ๊ณ„

ํ…Œ์ด๋ธ” ๋ฐ”๋‹ฅ ๊ธ€์— ์ง‘๊ณ„ ํ†ต๊ณ„๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  1. footer ์†Œํ’ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ tr ๋ฐ td
      <Table
        dataSource={dataSource}
        footer={() => {
          return (
            <tr className='ant-table-row  ant-table-row-level-0'>
              <td>ๆ€ป่ฎก</td>
              <td>ๆ€ป่ฎก</td>
            <td>ๆ€ป่ฎก</td>
            </tr>
          )
        }}
      />
  1. dataSource ์†Œํ’ˆ์— ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€
dataSource.push({id: 'ๆ€ป่ฎก', price: '3000'})

๋ฌด์—‡์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๊นŒ?

์‚ฌ์ง„์€ ์ฒœ ๋‹จ์–ด์˜ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

  1. footer ์†Œํ’ˆ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ footer ์†Œํ’ˆ์€ ํ…Œ์ด๋ธ” tbody์— ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  2. dataSource prop์— ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ dataSource ๊ธธ์ด๊ฐ€ pageSize ์ดˆ๊ณผํ•˜๋ฉด ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

Inactive IssueHuntFest โ“FAQ ๐Ÿ’ก Feature Request

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

footer ํ…Œ์ด๋ธ”์— ๋งž๊ฒŒ ๋ญ”๊ฐ€๋ฅผ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

๋ชจ๋“  78 ๋Œ“๊ธ€

@TangMonk ์•ˆ๋…•ํ•˜์„ธ์š”. ๋ฒ„๊ทธ๋ณด๊ณ ๋ณด๋‹ค ๊ธฐ๋Šฅ์„ ์š”์ฒญํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•˜์ง€๋งŒ์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๊ณ„ํš์ด ์—†์Šต๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํŽ˜์ด์ง€ ๋งค๊น€์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ์ง์ ‘ ํŽ˜์ด์ง€ ๋งค๊น€์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

footer ํ…Œ์ด๋ธ”์— ๋งž๊ฒŒ ๋ญ”๊ฐ€๋ฅผ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

@yesmeck , ๋‹ต์žฅ์„ ๋ณด๋‚ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.์ด ๊ธฐ๋Šฅ์ด ์ •๋ง ์œ ์šฉํ•˜๊ณ  ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ด€๋ จ ๋ฌธ์ œ : # 3591, # 1483, # 4581

@ afc163 , ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‹น์‹ ์˜ ์ œ์•ˆ์ด๋‚˜ ํ•ด๊ฒฐ์ฑ…์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. pageSize ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋ฅผ ์ œํ•œ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก์ด ์•„๋‹Œ ์„œ๋ฒ„ ์ธก์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋ฏ€๋กœ ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”,
์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ?

@yesmeck ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ…์€ ํ…Œ์ด๋ธ” ์™ธ๋ถ€์— ์ถ”๊ฐ€ <div> ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์‹  ๋ฐ”๋‹ฅ ๊ธ€์ด ํ…Œ์ด๋ธ” ๋‚ด๋ถ€์— ์‹ค์ œ <tfoot> ๋ Œ๋”๋งํ•˜๋„๋กํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์€ ๋‹จ์ˆœํžˆ ํ…Œ์ด๋ธ” ๋ ˆ์ด์•„์›ƒ์ด ์—ด์„ ์ •๋ ฌํ•˜๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€ ํ–‰์„ dataSource ์— ์งœ๋‚ด๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์ด๋ฏธ footer prop์ด ์žˆ์Šต๋‹ˆ๋‹ค. <tfoot/> ์˜ ์ ์ ˆํ•œ ์ด๋ฆ„์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด tfoot ์†Œํ’ˆ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ํ…Œ์ด๋ธ” ๋‚ด๋ถ€์— <tfoot /> ๋ Œ๋”๋งํ•˜๋„๋ก ํ˜„์žฌ footer ์†Œํ’ˆ์„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์•„๋ฌด๊ฒƒ๋„ ๋ง์น  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

@yesmeck ์ด ๊ธฐ๋Šฅ์ด ์ž์ฃผ ์š”์ฒญ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์š”์•ฝ ํ–‰์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ ํ•ดํ‚ค ๋” ์กฐ์ž‘์ด ํฌํ•จ๋˜์–ด ๋” ์˜ˆ์œ ์†”๋ฃจ์…˜์„ ๋ณด๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ ์ฒ˜๋ฆฌํ•˜๊ณ ์žˆ๋Š” ํŒ€์›์ด ์žˆ๋‚˜์š”? ๋งŒ์•ฝ ์•„๋‹ˆ๋ผ๋ฉด ๋‚ด๊ฐ€ ์กฐ์‚ฌ ํ•  ์ˆ˜์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

PR์„ ์‹œ๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@yesmeck ์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค : https://github.com/react-component/table/pull/191
ํšจ๊ณผ๋Š” example / renderFooterInTable์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

tfoot API์— ๋Œ€ํ•ด ์ž ์‹œ ์ƒ๊ฐํ•œ ํ›„ column ์†์„ฑ์— ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

const columns = [{
  title: 'Age',
  dataIndex: 'age',
  key: 'age',
  footer: (data) => {
    return <div>Summary: {data.reduce((sum, record) => sum + record.age, 0)}</div>
  },
}, {
  title: 'Name',
  dataIndex: 'name',
  key: 'name',
}, {
  title: 'Address',
  dataIndex: 'address',
  key: 'address',
}];

๋ Œ๋”๋ง

screen shot 2018-02-27 at 15 03 33

ํ˜„์žฌ Table[footer] ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋” ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ข‹์€ ์ƒ๊ฐ. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ƒˆ๋กœ์šด API๋ฅผ ์งœ๊ธฐ์— ๋” ์ข‹์€ ๊ณณ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

@hackape ์ƒˆ๋กœ์šด PR์„ ์ œ์•ˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ™•์‹คํ•œ ๊ฒƒ

https://codesandbox.io/s/m45r6o4nj8
๋‹ฌ์„ฑํ–ˆ์ง€๋งŒ ์Šคํฌ๋กค๋ฐ” ์—ฐ๋™์— ๋ฌธ์ œ๊ฐ€์žˆ์–ด๋ณด๊ธฐ๊ฐ€ ๋” ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค

@yesmeck react-component / table # 195์˜ ์ƒํƒœ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ํ”ผ๋“œ๋ฐฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํ•ฉ์ณ ๋ดค์–ด์š” ๐Ÿ‘ @yesmeck

๊ทธ๋Ÿฌ๋‚˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ์š”์ฒญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ‘œ ๋จธ๋ฆฌ๊ธ€ ๋ฐ”๋กœ ์•„๋ž˜ ํ‘œ ์ƒ๋‹จ์— ์†Œ์œ„ "๋ฐ”๋‹ฅ ๊ธ€"์ด ํ‘œ์‹œ๋˜๋„๋ก ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์˜ˆ:
image

์‹ค์ œ ์š”์ฒญ ๊ธฐ๋Šฅ์˜ ์กด์žฌ๋Š”์˜ ๋‚ด์šฉ์„ ํ›ผ์†ํ•˜์ง€ ์•Š๊ณ , ์ „์ฒด ์‹œ๊ฐ„ ํ†ต๊ณ„ ์ •๋ณด - ๋‹ค๋ฅธ ๋‹จ์–ด๋Š” "์š”์•ฝ ํ–‰"์„ ํ‘œ์‹œํ•˜๊ธฐ์œ„ํ•œ ๋ณ„๋„์˜ ํ–‰์— ์ง‘์–ด ๋„ฃ์€ ๊ฒƒ์ด ํ‰๊ท ์ž…๋‹ˆ๋‹ค ๋…ผ์˜ dataSource ์—์„œ๊ฐ€ ์•„๋‹Œ "๋ฐ”๋‹ฅ ๊ธ€" ์œ„์น˜ ๊ฐ๊ฐ.

@hackape ์—ด ๊ทธ๋ฃนํ™”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://codesandbox.io/s/pmorq2x2lq๋ฅผ ์ฐธ์กฐ

์˜ˆ, ํฌ์ง€์…”๋‹ ๋ชฉ์ ์œผ๋กœ ๋งŒ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ˆ˜๋‹จ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ธก๋ฉด์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์•ˆํ•œ API๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•˜๋„๋กํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

column.footer API์˜ ์ด๋ฆ„์„ column.summary ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const columns = [{
  title: 'Age',
  dataIndex: 'age',
  key: 'age',
  summary: {
    render: (data) => {
      return <div>Summary: {data.reduce((sum, record) => sum + record.age, 0)}</div>
    },
    position: 'bottom',  // default to 'bottom', could be 'top'
  }
}]

pinnedTopData ๋ฐ pinnedBottomData ๋ผ๋Š” ๋‘ ๋ช…์˜ ์ƒˆ๋กœ์šด ํ”„๋กœ๋ฅผ ์†Œ๊ฐœ ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

const columns = [
  { title: 'Price', dataIndex: 'price' },
  { name: 'Name', dataIndex: 'name' },
];

const data = [
  { price: 3, Name: 'Foo' },
  { price: 5, Name: 'Bar' },
];

const pinnedData = [
  { price: <span style={{ fontWeight: 'bold' }}>Total: 8</span> }
];

<Table
  columns={columns}
  dataSource={data}
  pinnedTopData={pinnedData}
  pinnedBottomData={pinnedData}
/>

๋ Œ๋”๋ง :

| ๊ฐ€๊ฒฉ | ์ด๋ฆ„ |
| ---------- | ------ |
| ํ•ฉ๊ณ„ : 8 | |
| 3 | Foo |
| 5 | ๋ฐ” |
| ํ•ฉ๊ณ„ : 8 | |

๋™์ผํ•œ API๋กœ # 6896๊ณผ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์ง„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@Nokecy ๋Š” ๊ทธ์˜ ์†”๋ฃจ์…˜์„ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ด…๋‹ˆ๋‹ค. ๊ทธ๋Š” ์ผ์‹œ์ ์œผ๋กœ ์†์„ฑ์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฒ„์ „ ๋ฒˆํ˜ธ๊ฐ€ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ๋˜๋ฉด ๊ทธ์˜ re-table์—์ด ์†์„ฑ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ antd ํŒจํ‚ค์ง€๋ฅผ ์ˆ˜์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. .json. ๋˜ํ•œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•,
1. ์—ด์ด ๋งŽ์ง€ ์•Š๊ณ  ์Šคํฌ๋กค๋ฐ”๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์œผ๋ฉด ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์œ„์˜ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
2. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ œ๋ชฉ ํ‘œ์‹œ ์ค„์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋„ˆ๋ฌด ์•„๋ฆ„๋‹ต ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๋“ค์ด์ด ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ณ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด๊ณ  ์žˆ์ง€๋งŒ ์šฐ๋ฆฌ์˜ antd๋Š” 2 ์ž…๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธํ•˜๋”๋ผ๋„ 2. ๋ฒ„์ „์—์ด ์†์„ฑ์ด

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ ??

๊ณต์‹ API๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์ „์— ์ง€๊ธˆ์€ table.props.components.body.wrapper ์‚ฌ์šฉ์ž ์ง€์ • ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ๊ณตํ•˜๊ณ ๋ฐ›์€ props.children ๋ณ€์กฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

https://codesandbox.io/s/xpvwpx0npw
dom ์š”์†Œ๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ•˜๊ณ  ํ•ฉ๊ณ„๋ฅผ ์บก์Šํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.์ด ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ํ‘ธํ„ฐ๋ฅผ ๋งŽ์ด ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ณต์‹์ ์œผ๋กœ๋Š” dom ์š”์†Œ์— ๋Œ€ํ•œ ์ง์ ‘ ์กฐ์ž‘์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธ‰ํžˆ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ LDD123 ์Šคํฌ๋กค x๋Š” ๊ท€ํ•˜์˜ ์˜ˆ์ œ์—์„œ ๋ฐ”๋‹ฅ ๊ธ€์—๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณธ๋ฌธ๋„ ๋ฐ”๋‹ฅ ๊ธ€๊ณผ ํ•จ๊ป˜ ์Šคํฌ๋กค๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

image

@jagratiTomar ๋ฐ”๋‹ฅ ๊ธ€์ด ์Šคํฌ๋กค ๋  ๋•Œ ๋ณธ๋ฌธ์ด ์Šคํฌ๋กค๋ฉ๋‹ˆ๋‹ค. ๋ณธ๋ฌธ์˜ scroll-x๋ฅผ ๋ฐ”๋‹ฅ ๊ธ€์˜ scroll-x์™€ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.

@ LDD123 ์€ ๋ณธ๋ฌธ์— scroll-y๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๊ณต์œ ํ•˜๊ณ  ์˜ˆ๋ฅผ ๋“ค์–ด

@jagratiTomar ์ง€๊ธˆ, ์Šคํฌ๋กค์ด ์•„๋‹Œ ์Šคํฌ๋กค -x๋ฅผ ์ˆจ๊ฒผ์Šต๋‹ˆ๋‹ค.

@ LDD123 ๊ทธ๋ž˜์„œ scroll-y๊ฐ€์žˆ์„ ๋•Œ์ด ์˜ˆ์ œ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์‘

์•ˆ๋…•ํ•˜์„ธ์š” @yesmeck @ afc163 ,

๋””์ž์ด๋„ˆ๋Š” UX ๋ชฉ์ ์„ ์œ„ํ•ด ๋ณธ๋ฌธ ์ƒ๋‹จ๊ณผ ๋จธ๋ฆฌ๊ธ€ ๋ฐ”๋กœ ์•„๋ž˜์— ๋ฐ”๋‹ฅ ๊ธ€ (์ง‘๊ณ„ ๋œ ๊ฐ’์ด ์žˆ์Œ)์„ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋จธ๋ฆฌ๊ธ€ ๋ฐ ๋ฐ”๋‹ฅ ๊ธ€ ์ •๋ ฌ์„์œ„ํ•œ ํ™”์‚ดํ‘œ์—๋Š” ์ง‘๊ณ„ ๋œ ๊ฐ’๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •๋ ฌ์„์œ„ํ•œ ColumnGroup ํ™”์‚ดํ‘œ๊ฐ€ ๋งจ ์•„๋ž˜์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์Šคํƒ€์ผ๋ง ๊ด€์ ์—์„œ ๋ฐ”๋‹ฅ ๊ธ€ ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒ‰์ƒ์ด ๋‹ค๋ฅด๊ณ  ์ผ๋ถ€ ์…€์—๋งŒ ๊ตฌ๋ถ„์ž๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋‹ฅ ๊ธ€ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๊ณ  ์ƒ๋‹จ์— ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹จ์ง€ ํ•  ๊ฒƒ์ด๋‹ค :

.my-table tfoot > tr {
 background-color: gray;
}

ํ…Œ์ด๋ธ” ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<Table appendColumnFooterTop={true}>
   <Column
      footer={(data) => <div>Summary: {data.reduce((sum, record) => sum + record.age, 0)}</div>}
   />
</Table>

๋””์ž์ธ:
screen shot 2018-05-30 at 17 07 38

์ด์ „์— ์ˆ˜ํ–‰ ํ•œ ํŽ˜์ด์ง€์˜ ์…€์—์žˆ๋Š” ์ •๋ ฌ๋˜์ง€ ์•Š์€ ํ…์ŠคํŠธ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ฝ”๋”ฉํ•˜๋Š” ์ƒˆ ํŽ˜์ด์ง€์— ์ •๋ ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

2 ์ฃผ ๋˜๋Š” 3 ์ฃผ ์ด๋‚ด์— ๋ฆด๋ฆฌ์Šค ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์—ด ๋ฐ”๋‹ฅ ๊ธ€ ๋ฐ ์ •๋ ฌ). ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

์•„ ๊ทธ๋ฆฌ๊ณ  # 6896์ด ์—ด ๋ฐ”๋‹ฅ ๊ธ€์— ๊ด€ํ•œ ๊ฒƒ์ธ์ง€ ์ดํ•ดํ•  ์ˆ˜ ์—†์–ด์„œ ์—ฌ๊ธฐ์— ์ผ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ.

@kaanozcan 3 ์›”์— ๋™์ผํ•œ ์•„์ด๋””์–ด ( ์—ฌ๊ธฐ ์ฐธ์กฐ)๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” PR์„ ์ œ์ถœํ–ˆ๋Š”๋ฐ ํ•ต์‹ฌ ํŒ€์ด์ด๋ฅผ ๋ณ‘ํ•ฉ ํ•œ ๋‹ค์Œ ๋˜๋Œ ๋ ธ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ƒ๊ฐ์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ƒํ™ฉ์„ ๊ฐ์•ˆํ•  ๋•Œ "๋‹ค๋ฅธ ์†”๋ฃจ์…˜ ์ฐพ๊ธฐ"๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@kaanozcan ๋‹ค์Œ์€ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ์˜ˆ์ž…๋‹ˆ๋‹ค. https://codesandbox.io/s/xjpkx9rzzw

@yesmeck ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ.

์›๋ž˜ ์š”์ฒญ์œผ๋กœ ์ธํ•œ ๋งˆ๊ฐ์€ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@yesmeck ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ๋ฐ๋ชจ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

https://codesandbox.io/s/xjpkx9rzzw
์ด ์˜ˆ์ œ๋Š” ์‹ค์ œ์ ์ธ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด .. ๋งˆ์ง€๋ง‰ ํ•ฉ๊ณ„๋Š” ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์ƒˆ๋กœ ๊ณ ์นจ์˜ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ๋”ํ‹ฐ ๋ฐ์ดํ„ฐ๊ฐ€์žˆ๋Š” ๊ณณ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@yesmeck ์ œ๊ณต ํ•œ ์˜ˆ์ œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค ... ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
const data = [ { key: "1", name: "John Brown", age: 30, address: "New York No. 1 Lake Park", }, { key: "2", name: "Jim Green", age: 20, address: "London No. 1 Lake Park", }, { key: "3", name: "Joe Black", age: Math.random() * 20, address: "Sidney No. 1 Lake Park", }, ]; ๊ฐ™์€ ์ˆ˜์ • ... ์‹ค์ œ๋กœ ์ตœ์ข… ํ•ฉ๊ณ„๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@yesmeck https://codesandbox.io/s/xjpkx9rzzw ์ด ๋ฐ๋ชจ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์™ผ์ชฝ์œผ๋กœ ๊ณ ์ •ํ•˜๋ฉด ์Šคํƒ€์ผ์ด ์—‰๋ง์ธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹คใ€‚

๊ตฌ์„ฑ ์š”์†Œ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ ๋‹ค์†Œ ์–ด์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

export default class extends PureComponent {
  constructor(props) {
    super(props);
    this.state = {
      localData: props.data,
    };

    this.tableRef = React.createRef();
  }

  handleTableUpdate = () => {
    this.setState({ localData: this.tableRef.current.getLocalData() });
  }

  render() {
    return (
      <Table
        ref={this.tableRef}
        columns={this.props.columns}
        dataSource={this.props.data}
        onChange={this.handleTableUpdate}
        components={{
          body: {
            wrapper: (props) => (
              <BodyWithSummary
                columns={this.props.columns}
                data={this.state.localData}
                {...props}
              />
            ),
          },
        }}
      />
    );
  }
}

function BodyWithSummary(props) {
  const { data, columns, ...otherProps } = props;
  return (
    <tbody {...otherProps}>
      <React.Fragment>
        {data && data.length > 0 && (
          <tr>
            {props.columns.map((col) => renderColumn(col, data))}
          </tr>
        )}
        {props.children}
      </React.Fragment>
    </tbody>
  );
}

์„ฑ๊ฐ€์‹  ์ ์€ ํ•„ํ„ฐ๋ง ๋œ ํ–‰์—์„œ ์ง‘๊ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์‚ฐํ•˜๋ ค๋ฉด getLocalData ๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋ณธ๋ฌธ ๋ž˜ํผ๊ฐ€ ํ…Œ์ด๋ธ” ์ฐธ์กฐ๋ฅผ ์†Œํ’ˆ์œผ๋กœ ๋ฐ›๊ฑฐ๋‚˜ ๋ Œ๋”๋ง ๋  ๋ฐ์ดํ„ฐ์— ๋” ์‰ฝ๊ฒŒ ์•ก์„ธ์Šค ํ•  ์ˆ˜์žˆ๋Š” ๊ฒฝ์šฐ ํ›จ์”ฌ ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (props.children์€ ๋ฐ˜์‘ ๋…ธ๋“œ ๋ชฉ๋ก์ด๋ฉฐ ์ง‘๊ณ„ ๊ณ„์‚ฐ์— ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€ ์•Š์Œ).

footer prop์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ถ”๊ฐ€ div ๋Œ€์‹  ํ…Œ์ด๋ธ”์—์„œ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ผ์‹œ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

20180927 0905

      .ant-table-footer {
        padding: 0;
      }
                                    footer={(currentPageData)=>{
                                        return (
                                            <Row style={{marginRight:17}}>
                                                <Col span={4} className="brd">
                                                    <Card bordered={false} className="bgfb" bodyStyle={{padding:'10px 15px'}}>ๅˆ่ฎก</Card>
                                                </Col>
                                                <Col span={4} className="brd">
                                                    <Card bordered={false} className="bgfb" bodyStyle={{padding:'10px 15px'}}>123456789</Card>
                                                </Col>
                                                <Col span={4} className="brd">
                                                    <Card bordered={false} className="bgfb" bodyStyle={{padding:'10px 15px'}}>123456789</Card>
                                                </Col>
                                                <Col span={4} className="brd">
                                                    <Card bordered={false} className="bgfb" bodyStyle={{padding:'10px 15px'}}>123456789</Card>
                                                </Col>
                                                <Col span={4} className="brd">
                                                    <Card bordered={false} className="bgfb" bodyStyle={{padding:'10px 15px'}}>123456789</Card>
                                                </Col>
                                                <Col span={4}>
                                                    <Card bordered={false} className="bgfb" bodyStyle={{padding:'10px 15px'}}>123456789</Card>
                                                </Col>
                                            </Row>
                                        );
                                    }}

์™„๋ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ณง ๋‚˜์˜ฌ ๊ธฐ๋‘ฅ ๋ฐ‘๋ฐ”๋‹ฅ์„ ๊ธฐ๋Œ€ O (โˆฉ_โˆฉ) O

@ybning ๊ณ ์ • ์ปฌ๋Ÿผ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋Ÿฌํ•œ ๊ณ ์ • ๋œ ์—ด ์ค‘ ์ƒ๋‹น์ˆ˜๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. .

@yesmeck ๊ท€ํ•˜์˜ ์˜ˆ์ œ๋Š” ๋‚ด๋ถ€ ํ…Œ์ด๋ธ” ๊ณ„์‚ฐ์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค : https://codesandbox.io/s/rrpo02qwkq
2 ํŽ˜์ด์ง€๋กœ ์ด๋™ ํ•œ ๋‹ค์Œ 1 ํŽ˜์ด์ง€๋กœ ๋Œ์•„ ๊ฐ€๋ฉด ๊ฐ ํƒ์ƒ‰์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณต์ œ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@linrf ์•„๋‹ˆ,

์ด๋ ‡๊ฒŒ.
https://codepen.io/chaegumi/pen/OaqxVd

๊ฑฐ๋ž˜ ์ง‘๊ณ„ ํ†ต๊ณ„์— total prop์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
total ๋Š” footer ์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
์—ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜ ๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ reduce

v7a kvx 5cig rjeo 696g
๋งˆ์นจ๋‚ด ์—ด์— ํ•ฉ๊ณ„๋ฅผ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.

antd์˜ ํ…Œ์ด๋ธ” ๋ฐ”๋‹ฅ ๊ธ€ ๋‚ด์šฉ์˜ ๋ Œ๋”๋ง์€ ํŠนํžˆ ํ…Œ์ด๋ธ” ์ž์ฒด์— ๊ณ ์ • ๋œ ์—ด์ด์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฐœ์˜ ํ…Œ์ด๋ธ”๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์›๋ณธ ํ…Œ์ด๋ธ”์„ ๋ Œ๋”๋งํ•˜๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ํ•˜๋‹จ์— ๋ฐ”๋‹ฅ ๊ธ€ ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์Šคํƒ€์ผ ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ” ๋ฐ”๋‹ฅ ๊ธ€์˜ ๊ด‘๊ณ ์™€ ์›๋ž˜ ํ…Œ์ด๋ธ” ์Šคํฌ๋กค ์˜์—ญ์˜ ์Šคํฌ๋กค ๋ง‰๋Œ€๋ฅผ ์ˆจ ๊น๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‘ ํ…Œ์ด๋ธ”์˜ ๊ฐ€๋กœ ์Šคํฌ๋กค ์œ„์น˜๋ฅผ ์ •๋ ฌํ•˜๋Š” JS ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑํ’ˆ :

import React, { PureComponent } from 'react';
import { Table } from 'antd';
import styles from './index.less';

export default class ChartTable extends PureComponent {
  constructor(props) {
    super(props);

    this.refBox = React.createRef();
  }
  componentDidMount() {
    const tableList = Array.from(this.refBox.current.querySelectorAll('.ant-table-body'));
    this.tableList = tableList;
    tableList.forEach((table) => {
      table.addEventListener('scroll', this.handleTableScroll);
    });
  }
  componentWillUnmount() {
    this.tableList.forEach((table) => {
      table.removeEventListener('scroll', this.handleTableScroll);
    });
  }
  handleTableScroll = (e) => {
    const current = e.currentTarget;
    this.tableList.forEach((table) => {
      if (table !== current && table.scrollLeft !== current.scrollLeft) {
        table.scrollLeft = current.scrollLeft;
      }
    });
  }
  renderFooterTable = () => {
    const { columns, dataSource } = this.props;
    const dataList = [{
      department: 'ๅˆ่ฎก',
    }];
    return (
      <Table
        className={styles.footerTable}
        pagination={false}
        scroll={{ x: 'max-content' }}
        size="small"
        columns={columns}
        dataSource={dataList}
      />
    );
  }
  render() {
    return (
      <div ref={this.refBox}>
        <Table
          className={styles.mainTable}
          pagination={false}
          scroll={{ x: 'max-content', y: 350 }}
          size="small"
          columns={this.props.columns}
          dataSource={this.props.dataSource}
        />
        {this.renderFooterTable()}
      </div>
    );
  }
}

์Šคํƒ€์ผ ์ปค๋ฒ„๋ฆฌ์ง€ ํŒŒ์ผ :

mainTable {
  :global {
    .ant-table-body::-webkit-scrollbar {
      display: none;
    }
  }  
}
.footerTable {
  border-top: 1px solid #e8e8e8;

  :global {
    thead {
      display: none;
    }
  }
}

+1 ๋ฐ”๋‹ฅ ๊ธ€์— ์—ด ์ง‘๊ณ„๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

component prop์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const __Table = (totalsRow = initTotals(), key='tableKey') => ({
    className,
    style,
    children
}) => (
    <table className={className} style={style} key={key}>
        {children}
        <tfoot>
            <tr>
                // add tfoot td here
            </tr>
        </tfoot>
    </table>
);

const TableWithTFoot = ({allData, columns}) =>
    <Table
        dataSource={allData.data}
        columns={columns}
        pagination={false}
        components={{ table: __Table(allData.totals) }}
    />

@rororofff ๋Š”์ด ๋ฌธ์ œ์— $ 5.00๋ฅผ ํˆฌ์žํ–ˆ์Šต๋‹ˆ๋‹ค.


  • ์ด ๋ณด์ƒ์„ ๋ฐ›์œผ๋ ค๋ฉด IssueHunt ๋ฅผ ํ†ตํ•ด ํ’€ ์š”์ฒญ์„ ์ œ์ถœํ•˜์‹ญ์‹œ์˜ค.
  • ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? IssueHunt ๋ฅผ ํ•˜์„ธ์š” .
  • ๋” ๋งŽ์€ ์ž๊ธˆ ์ง€์› ๋ฌธ์ œ๋ฅผ ๋ณด๋ ค๋ฉด IssueHunt ๋ฌธ์ œ ํƒ์ƒ‰๊ธฐ ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • ๊ฐœ๋ฐœ์ž์˜ ๋„์›€์ด ํ•„์š”ํ•˜์‹ญ๋‹ˆ๊นŒ? ์ž๊ธˆ์„ ๋ชจ์œผ๋ ค๋ฉด IssueHunt์— ์ €์žฅ์†Œ ๋ฅผ

@piuccio ๋‹น์‹ ์˜ ์ƒ๊ฐ์— ๋”ฐ๋ฅด๋ฉด, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํƒ€์ดํ”„ ์Šคํฌ๋ฆฝํŠธ๋กœ ์”๋‹ˆ๋‹ค.

https://github.com/Arweil/antd-ext/blob/master/src/TableExt/TableExt.tsx

https://github.com/ant-design/ant-design/issues/5710#issuecomment -450855438

this.refBox = React.createRef();

์ด ๋ฒ„์ „ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.
"antd": "2.13.14", "react": "15.4.0", "react-dom": "15.4.0"

์—๋Ÿฌ ๋ฉ”์‹œ์ง€
Uncaught TypeError: _react2.default.createRef is not a function at new EstimationReport (psReport.js?18c1:47) at eval (ReactCompositeComponent.js?063f:295) at measureLifeCyclePerf (ReactCompositeComponent.js?063f:75) at

@carvendy react ๊ฐ€์ ธ์˜ฌ ๋•Œ ์•„๋งˆ๋„ ๋ชจ๋“ˆ ํ•ด๊ฒฐ ์„ค์ •์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‹œ๋„

import from 'react';

์ด๊ฒƒ์œผ๋กœ :

import * as react from 'react'

๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
์—ด ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ”๋‹ฅ ๊ธ€ ๋ Œ๋”๋ง
๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ์Šคํฌ๋กค ๋ง‰๋Œ€๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

import React from 'react';

class TableFooter extends React.Component {
  render() {
    const { dataSource, columns } = this.props;
    return (
      <table className="ant-table">
        <colgroup>
          {columns.map((colModel, index) => {
            return <col style={{
              width: colModel.width,
              minWidth: colModel.width
            }} key={index} />
          })}
        </colgroup>
        <tfoot >
          <tr >
            {columns.map((colum, idxCol) => {
              return <td style={{ padding: "0px 8px" }} className={colum.className} key={idxCol}>
                <strong>
                  {colum.footerContent ? colum.footerContent : (colum.footerSum ? dataSource.reduce((sum, record) => sum + parseFloat(record[colum.key]), 0) : "")}
                </strong>
              </td>
            })}
          </tr>
        </tfoot>
      </table>
    )
  }
}
export default TableFooter;

ํŽ˜์ด์ง€ ํ˜ธ์ถœ

...
render() {
  const columns = [
      {
        key: 'productName'
        footerContent: 'SUM:',
      },
      {
        key: 'quantity',
        footerSum: true,
      }
    }
];
return (
  <Table
    columns={columns}
    dataSource={dataSource}
    footer={()=> {
        return (
           <TableFooter dataSource={dataSource} columns={columns} />
        )
       }
    }
  />
)
....

var data = this.getLocalData ();
var current;
var pageSize;
var state = this.state; // ํŽ˜์ด์ง•์ด ์—†์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

  if (!this.hasPagination()) {
    pageSize = Number.MAX_VALUE;
    current = 1;
  } else {
    pageSize = state.pagination.pageSize;
    current = this.getMaxCurrent(state.pagination.total || data.length);
  } // ๅˆ†้กต
  // ---
  // ๅฝ“ๆ•ฐๆฎ้‡ๅฐ‘ไบŽ็ญ‰ไบŽๆฏ้กตๆ•ฐ้‡ๆ—ถ๏ผŒ็›ดๆŽฅ่ฎพ็ฝฎๆ•ฐๆฎ
  // ๅฆๅˆ™่ฟ›่กŒ่ฏปๅ–ๅˆ†้กตๆ•ฐๆฎ


  if (data.length > pageSize || pageSize === Number.MAX_VALUE) {
    data = data.filter(function (_, i) {
      return i >= (current - 1) * pageSize && i < current * pageSize;
    });
  }

  return data;
}

์ด๊ฒƒ์€ ํ…Œ์ด๋ธ” ์ฒ˜๋ฆฌ ๋ฐ์ดํ„ฐ์˜ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์—ฌ๊ธฐ์— ๋ชฉ๋ก ๊ฐ’์˜ ํ•ฉ๊ณ„๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์ถœ๋ ฅ ํ•  ๋•Œ ์ด ๋ฐ์ดํ„ฐ ์ˆ˜๋ฅผ ๋”ํ•˜๊ณ  ํŽ˜์ด์ง€ ๋ฐ ํŽ˜์ด์ง€ ํฌ๊ธฐ์—์„œ ๋ฐฉ๊ธˆ ์ถ”๊ฐ€ ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋นผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. @sorrycc

2 ๋…„ ํ›„์—๋„์ด ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

2 ๋…„ ํ›„์—๋„์ด ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์›๋ž˜ col์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ณ  ๋น„ ํŽ˜์ด์ง• ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ Œ๋”๋ง์„ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

image

์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋กœ๋“œํ•˜์ง€๋งŒ ๋งค๊น€์˜ ๊ฒฝ์šฐ, ๊ทธ๊ฒƒ์€ ์‚ดํ•ด๋ฉ๋‹ˆ๋‹ค. https://github.com/ant-design/ant-design/blob/fee5e291632cce131611dd1a9e2ab89e02ee43a3/components/table/Table.tsx#L407

ํ™๋ณดํ•˜๊ณ  ์‹ถ์ง€๋งŒ API ๋””์ž์ธ์ด ์ƒ์‚ฌ์˜ @ afc163 ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ด

2 ๋…„ ํ›„์—๋„์ด ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋Š” ๊ธธ์— ์ƒˆ ํ…Œ์ด๋ธ”. ์ƒˆ ํ…Œ์ด๋ธ”์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/ant-design/ant-design/issues/16911#issuecomment -523423460

@ alexchen1875 ์ด๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ์–ด๋–ค ๊ฒƒ๋„ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@ alexchen1875 ์ด๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ์–ด๋–ค ๊ฒƒ๋„ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ํ‘œ ์„น์…˜์˜ ์ง€์นจ์„์ฃผ์˜ ๊นŠ๊ฒŒ ์ฝ์œผ์‹ญ์‹œ์˜ค.

ํŠธ์œ— ๋‹ด์•„ ๊ฐ€๊ธฐ

PR์„ ์ œ์ถœํ•˜๊ณ  ๊ฑด๋„ˆ ๋›ฐ๊ธฐ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ผ์‹œ์ ์œผ๋กœ "๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฅด์ง€ ์•Š๋„๋ก ๋ฐ์ดํ„ฐ ํ—ˆ์šฉ"์†Œํ’ˆ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. https://github.com/ant-design/ant-design/blob/61e319b66826530a1882c20a41862a15d57b120a/components/table/Table.tsx # L408 ์˜ ํ•„ํ„ฐ ๋กœ์ง์€ ํŽ˜์ด์ง€ ๋งค๊น€์˜ ๊ฒฝ์šฐ https://github.com/ant-design/ant-design/issues/5710#issuecomment -524164125๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋กํ•ฉ๋‹ˆ๋‹ค. ํŒ€์ด ์ˆ˜๋ฝํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค .. .

์ด ๋ฐ๋ชจ๋ฅผ ์ˆ˜์ •
๊ณ ์ • ์—ด , ํ—ค๋” ๊ทธ๋ฃน , ์…€ ๋ณ‘ํ•ฉ ๋ฐ ์Šคํฌ๋กค ์ง€์› ์ถ”๊ฐ€,
๋‚˜๋Š” ์‚ฌ์šฉํ–ˆ๋‹ค

ํŽ˜์ด์ง•์€ ์˜ํ–ฅ์„๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ์ผ์‹œ์ ์œผ๋กœ ์‚ฌ์šฉ๋จ

๐Ÿ‘‰ ์ƒˆ๋กœ์šด ๋ฐ๋ชจ ์ฃผ์†Œ

์‚ฌ์šฉ๋ฒ• :

const calcRow = [
    {
        colspan: 2,
        render: () => 'total'
    },
    {
        render: sum => sum('age')
    },
    {
        render: sum => sum('score')
    }
]

image

antd v4๋Š” ํ…Œ์ด๋ธ” summary : # 21656์„ ์ง€์›ํ–ˆ์Šต๋‹ˆ๋‹ค.

image

https://ant.design/components/table/#components -table-demo-summary

antd4๋Š” ์š”์•ฝ์„ ์ง€์›ํ•˜์ง€๋งŒ์ด ์š”์•ฝ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฐ˜๋ณต๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด๋ฃŒ์ด์ง€๋งŒ ๋™์‹œ์— ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋ฒˆ๊ฑฐ๋กญ๊ณ  ์›๋ž˜ ์˜๋„์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. antd4๊ฐ€ ์ ์  ๋” ๋‹จ์ˆœ ํ•ด์ง‘๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๊ฐ„๋‹จํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์•ฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์นœ์ˆ™ํ•œ ๊ฒฝํ—˜์€ ์š”์•ฝ ์„ ์ง์ ‘ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, cloumn์—์„œ

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰