Try putting keys onto all the :td. These keys only need to be unique among 
peers.  So you can probably just hard code column numbers, like `{:key "1"}`

I'm not at all sure this will work,  but if React is the problem, then we 
need to give it all the help we can.  


On Tuesday, August 30, 2016 at 8:53:37 AM UTC+10, jona...@mohiji.org wrote:
>
> Ok, I gave something similar a try: just rendering a table with 1,000 rows 
> in it, doing both big and large changes with and without keys.
>
> My re-frame db is just {:rows []}, where the rows are just maps with :id, 
> :name, and :value fields. The :ids are integers, names are strings and 
> values are uuids.
>
> I have a subscription into that db to just grab all the rows out:
>
> (register-sub :rows
>   (fn [db _]
>     (reagent/ratom (:rows @db))))
>
> And a couple of handlers to initialize the db and delete rows out of it:
>
> (register-handler :init-db
>   (fn [db _]
>     default-db))
>
> (register-handler :delete
>   [trim-v]
>   (fn [db [row]]
>     (update-in db [:rows] (fn [rows] (remove #(= row (:id %)) rows))))
>
> Then I tried rendering the table mostly like this:
>
> (defn table
>   []
>   (let [rows (subscribe [:rows])
>         sort-key (reagent/atom :id)]
>     (fn []
>       (let [rows (sort-by @sort-key @rows)]
>          [:table
>            [:thead (.. header def here, with links to change the sort-key 
> atom ..)]
>            [:tbody
>             (for [row rows]
>               ;; ^{:key (:id row)}
>               [:tr
>                 [:td (:id row)]
>                 [:td (:name row)]
>                 [:td (:value row)]
>                 [:td [:a {:href "#" :on-click (fn [e] (.preventDefault e) 
> (dispatch [:delete (:id row)]))} "Delete"]])]]))))
>
> With that setup, the initial render (e.g. load Chrome's Timeline profiler, 
> hit refresh, look for the big render event in there) takes about 2 seconds. 
> Re-sorting the table by switching that sort-key atom takes about 850ms to 
> re-render without keys, 670 with keys. Deleting rows takes about 930ms 
> without keys, 610ms with keys. Totally slow.
>
> I tried factoring out the row component (which you're already doing above) 
> and things improve when keys are in place. The initial render went to 2.8s 
> without keys and stayed about 2s with keys. Sorting went way south to 6.8s 
> without keys, but 582ms with keys. Deleting is 1.3s without keys, 200ms 
> with.
>
> Looking at the timeline, that last scenario (rows as a separate component, 
> with keys) shows about 65ms rebuilding the Hiccup to render the table, but 
> only about 8ms of that is spent building the individual rows. React's still 
> taking most of the time.
>
> Trying to think of a way that rearranging the input data might let React 
> chew through this faster, but it's not coming to me.
>
> On Sunday, August 28, 2016 at 3:52:41 PM UTC-7, Marco Laspe wrote:
>>
>> I think react accepts both. I read it in the docs, that both work.
>>
>> Either way, it doesn't help. Doesn't matter if the key is metadata befor 
>> the [tr , or :key or :data-key. All is slow as f... :(
>>
>> On Friday, August 26, 2016 at 8:59:09 PM UTC+2, jona...@mohiji.org wrote:
>>>
>>> It looks like you can also assign the key in the place you're doing it 
>>> now, but data-key is the wrong name for it. It should just be :key, like:
>>>
>>> [:tr {:key (:key t) :on-click h/onclick-task :class class}
>>>
>>> Honestly, I'm a little surprised data-key isn't getting a complain from 
>>> the compiler, unless you have it def-ed somewhere else.
>>>
>>> On Friday, August 26, 2016 at 11:56:28 AM UTC-7, Walton Hoops wrote:
>>>>
>>>> That doesn't do it, no. The key is added as metadata to the component, 
>>>> for example:
>>>> (defn lister [items]
>>>>   [:ul
>>>>    (for [item items]
>>>>      ^{:key item} [:li "Item " item])])
>>>>
>>>> Interestingly, you are assigning a key to the table, which doesn't need 
>>>> one, but not inside your for loop, which could benefit from keys.
>>>>
>>>> August 26 2016 12:50 PM, "Marco Laspe' via Reagent-Project" <
>>>> reagent...@googlegroups.com>
>>>> wrote:
>>>>
>>>> > Thanks for the answer.
>>>> > 
>>>> > No, react doesn't complain. I think I add a key to every row:
>>>> > 
>>>> > [:tr {data-key (:key t) :on-click h/onclick-task :class class} ...
>>>> > 
>>>> > that should do the trick, or do I miss something?
>>>> > 
>>>> > Best,
>>>> > 
>>>> > Marco
>>>> > 
>>>> > On Tuesday, August 23, 2016 at 12:35:50 AM UTC+2, jona...@mohiji.org 
>>>> wrote:
>>>> > 
>>>> >> Does React complain at all about keys in your console? I see that 
>>>> you've added a key to the table
>>>> >> as a whole, but your individual rows don't have keys assigned to 
>>>> them. Try adding ^{:key (:key t)}
>>>> >> before your [tr]s and see if it helps out any. I saw a huge 
>>>> performance difference when doing
>>>> >> something similar: a list of a few hundred almost identical elements 
>>>> that stuttered like crazy
>>>> >> without the keys, and was butter smooth with them.
>>>> >> 
>>>> >> On Thursday, August 4, 2016 at 6:49:51 AM UTC-7, Marco Laspe wrote:
>>>> >>> Cheers,
>>>> >>> 
>>>> >>> I am building a task manager with reagent, that has a long table 
>>>> (490 rows) of tasks. To create the
>>>> >>> table I use following two components:
>>>> >>> 
>>>> >>> (defn task [t]
>>>> >>> 
>>>> >>> (let [class (if (= (db/selected) (:key t))
>>>> >>> 
>>>> >>> "selected"
>>>> >>> 
>>>> >>> "")]
>>>> >>> 
>>>> >>> [:tr {data-key (:key t) :on-click h/onclick-task :class class}
>>>> >>> 
>>>> >>> [:td.taskstate {:on-click h/handle-onclick-taskstate} [:span 
>>>> {:class "hover-button"} (:todo t)]]
>>>> >>> 
>>>> >>> [:td [:span.project-tag.label (:project t)] (:headline t)]
>>>> >>> 
>>>> >>> [:td.rank [:span.fa.fa-chevron-up.hover-button {:on-click 
>>>> h/handle-onclick-up}]]
>>>> >>> [:td.rank [:span.fa.fa-chevron-down.hover-button {:on-click 
>>>> h/handle-onclick-down}]]]))
>>>> >>> 
>>>> >>> (defn task-table [tb]
>>>> >>> (if (empty? tb)
>>>> >>> (empty-message)
>>>> >>> [:table.table ^{:key (:todo (first tb))}
>>>> >>> [:tbody
>>>> >>> (println (count tb))
>>>> >>> (for [t tb]
>>>> >>> [task t])]]))
>>>> >>> 
>>>> >>> If I am now changing the state of tb the ui freezes for about 10 
>>>> seconds if the task list is this
>>>> >>> long. If the tasks list about 100 rows the UI freezes for a half 
>>>> second and if the task list has
>>>> >>> only a view items it reacts instantly. From the profiler it seems 
>>>> as React is doing a lot of stuff
>>>> >>> in this case.
>>>> >>> 
>>>> >>> My question now is: Am I doing something wrong with my components. 
>>>> Mike Thompson writes in Eek!
>>>> >>> Performance Problems that you should not give the entire state to a 
>>>> component if not necessary and
>>>> >>> that should divide the UI in more components to have less 
>>>> re-rendering. 
>>>> >>> 
>>>> >>> I think the code above does that. Do I miss something?
>>>> >>> 
>>>> >>> Best,
>>>> >>> Marco
>>>> > 
>>>> > --
>>>> > You received this message because you are subscribed to the Google 
>>>> Groups "Reagent-Project" group.
>>>> > To unsubscribe from this group and stop receiving emails from it, 
>>>> send an email to
>>>> > reagent-proje...@googlegroups.com.
>>>> > To post to this group, send email to reagent...@googlegroups.com.
>>>> > Visit this group at https://groups.google.com/group/reagent-project.
>>>> > For more options, visit https://groups.google.com/d/optout. 
>>>>
>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"Reagent-Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to reagent-project+unsubscr...@googlegroups.com.
To post to this group, send email to reagent-project@googlegroups.com.
Visit this group at https://groups.google.com/group/reagent-project.
For more options, visit https://groups.google.com/d/optout.

Reply via email to